Is it ethical for a CS profesor to assign development of real world systems? I am a CS major, currently enrolled (about to finish) in a Software Engineering (II) course. My teacher told us at the beginning of the the first course (SE I) that the main objective of the class is to develop real world systems, as such she asked us to search for an NGO who was in need of an information system and go develop it for them during the length of the course. It is supposed that it is a way for the university to socially  project itself (and supposedly us). To be fair to her it was assigned as a group activity but I decided to work by myself.

I went to an NGO and asked if they were in need of a system and told me that they were, but that if I were to develop anything for them I couldn't just go and install it, I would merely be presenting it to the local authorities and they decided it was good they would propose it to a higher authorities. So the implementation of the system was (obviously) not guaranteed, and that was a requirement (the system must be implemented).

My teacher said she wouldn't consider any systems that were not guaranteed to be implemented. I feel that is an overstretch considering we were (are) not certified professionals (yet), and the NGOs were not asking for the software. Other majors are (for the most part) not required to participate in real world activities (e.g. a civil engineering major is not required to go look for a real world construction and WORK on it, to ask for some information maybe, but not to go do actual real work).

To be clear this was not a research assignment, she asked us to look for a real world system that needed to be developed and just go do it.

The justification for this is that we would gain experience by doing it (both in systems analysis and working in teams) but she never really taught us any of that (no git, no unit testing, no UI testing, no integration tests, no nothing). To emphasize how she didn't even teach us how to work in groups: I told her that I had created a repository to host my project and show all the changes that occur, and suggested her to tell the others (who were working in groups) to do the same and make sharing code easier and she basically told me that passing the projects around in flash drives and making full copies of the different versions was a better way to do things.

The few lectures we had were about types of software and software lifecycle without which were really shallow in nature (merely definitions of concepts).

She would ask us to show her our progress weekly, and she didn't care of under the hood changes, if it was not visible on screen, she would say we had done nothing (with is something she even taught us: changes are not always visible).

In the end everyone had a horrible time with that class (specially me as I was working by myself) and had to relive it for the next class. I saw how my classmates were doing disastrous jobs with their software (dbs with no passwords, no sanitizing SQL queries, every client was making a direct connection to the dbs instead of through an API, etc...) and she really didn't care at all, indeed she suggested some of those things, she really just cared about the UI looking nice.

So the question is: Is it ethical for this teacher to require us to go work (unsupervised) on an unsolicited real world system (which was not backed, required nor supervised by university authorities), without being paid for it, and requiring that whoever accepted our work would have to guarantee that they would implement our software, and if they didn't we would fail the course?

I think it is unethical, and a potential legal problem for her, the university and us the students, given the high potential of these systems malfunctioning or being insecure, considering these are sort of high profile organizations. But still I want to hear what is the general opinion on this matter and could I do about it.

BTW since we had so few lectures we didn't even had a final test, instead we would have to prove that our systems were implemented to pass.
Implementation is ethical. It is ethical for your teacher to require implementation of a system for real-world deployment. Albeit, it would be better if the word prototype were included.

Deployment is unethical. It is unethical for your teacher to claim that any such implementation is suitable for deployment.

Side note. Your teacher cannot expect any NGO to deploy implementations.

Additional remark. It is abysmal to teach students that
"passing [source code] around in flash drives and making full copies of the different versions was a better way to do things [compared to using a repository]."