11 ms·
Foundations of Software Engineering
- boberoni 6y agoI'm glad that the lecture slides were publicly available. I was particularly excited about the slides for architecture and design docs. I just wish I could sit in to listen on lectures (or have the discipline to read through the textbook :PP). In my undergrad, I felt that my CS classes were divided into "theory" and "systems". But, even the "systems" classes would feel removed from the modern tech industry and commercial software. The topics that I see mentioned in the syllabus are familiar to me, but only because I surf Medium articles, and not because of my formal CS education. Yet, these topics are incredibly deep and complex. I would consider the people who work on them to be researchers in a hyper-specific domain.
- alexgartrell 6y agoI took and TAed this class. I ended up dipping my toes into the open source waters with some Firefox contributions and completing the rest of the minor program including a set of contributions to Chromium. One thing that was heavily emphasized in that curriculum was how open source can be a huge asset to companies. I really took this to heart, and it has played a significant role in shaping open source strategy for containers and Linux stuff at Facebook.
- logicchains 6y agoNote that this is not to be confused with Software Foundations, the course on formal software verification: https://softwarefoundations.cis.upenn.edu/ https://softwarefoundations.cis.upenn.edu/.
- iamcreasy 6y agoDoes anybody know if there associated videos are available?
- olejorgenb 6y agoNot currently: https://news.ycombinator.com/item?id=24952019 https://news.ycombinator.com/item?id=24952019
- aidos 6y ago> You can write code. Can you build software? After 20 years doing this job I can confirm that building software is really hard. I’m not sure how you really give people experience with that. My courses at uni did little to prepare me for building software. Once you have a codebase in place, things are a whole lot easier. There are far fewer decisions to be made. Really you have little choice in how to do things as the current structure dictates your options. Discussions with customers are easier too, as you’re no longer talking in the abstract. But it’s really challenging reaching that point. Edit: having said all that, this does look like an interesting course
- bredren 6y agoThere is art to it. I wonder if it can be taught.
- niho 6y agoArt schools that teach you visual art and craft is a thing. So I don’t see why it would be impossible to teach the art of building software. We just need to change our methods.
- waheoo 6y agoPragmatic programmer does a decent job of it. Not perfect, but decent enough. I'm of the school that thinks it's something you need to practice. Many software positions especially in large companies are very limited in scope, you basically just maintain and patch existing systems, rarely having to build systems from scratch. Building these systems from the ground up is what is hard but you learn what works and what doesn't the more you do it. If you want to learn how to build software, join a start up or small company that has a healthy appreciation for what software rewrites can provide. Run away from companies that follow the never rewrite mantra. Usually saying something like you'll just repeat mistakes, its like well no shit this thing was built before I was born, if you rebuilt it with me here I could avoid those mistakes. I'm not saying you should always rewrite, its usually better to refactor, but some design failures are hard to refactor out, have double binds or are too critical for stability woes. But systems that live forever should have unlimited quality assurance budgets for refactor and repair, very few do in this industry. Managers seem to expect systems to live forever all while constantly patching with very small refactoring budgets. It's completely insane. Like running a machine in a factory 24/7 and never doing maintenance but expecting it to work perfectly like new forever with no future cost incurred as eventual debt.
- haihaibye 6y agoThis looks truly excellent, I'm glad CS is starting to teach the core skills needed for day to day practice of most graduates.
- charlysl 6y agoThe course's github page also has previous years' materials: https://github.com/CMU-313/CMU-313.github.io https://github.com/CMU-313/CMU-313.github.io
- zokier 6y agoPersonally I feel like our software development methodologies/technologies/tools are drastically underequipped to handle the complexity of the systems we are attempting to build. I'd estimate we'd maybe be at the level now to handle complexity of software 30-40 years ago (i.e. 80s software), but that is not based on anything solid because in the world of software there is precious little solid to base anything of. The free lunch we have been enjoying might come to an end now that software is imbuing itself more and more to things that really matter, like human rights and safety. Electronic voting and self-driving cars come to mind as examples. Of course another problem is that not only is software engineering still pretty immature, its use also is very unevenly distributed. While we might be able to build software somewhat reliably with state of the art tools and methods, vast majority does not use them. Not that we have much agreement on our field what constitutes unequivocally good practices. This has lead to the situation that even the basic foundational building blocks we use are usually of dubious quality.
- mstipetic 6y agoI used to think that but now I don't think we're getting better. The more I think about it the more I see that people are equally bad at it, progress only happens by building out the tooling beneath them that allow them to build more and more complicated things, without them realizing it. Developers have the capacity and willingness to work on a small part of a codebase and the rest has to be filled in by others in a similar situation and by tooling. I'm a bit biased since I run an edtech company but it's very disappointing to see how hard it is to get companies and people to actually invest in education.
- peteradio 6y agoI question the need for all this complexity.
- ChrisMarshallNY 6y agoCMU has always been big on this kind of thing. I took a CMM (pre-CMMI) course there, about twenty years ago. I tend to write stuff I architect from the ground, up. This has earned me a number of sneers, and comments about “reinventing the wheel,” but I seem to have picked up a knack for it, from many years of experience (my very first engineering project, in 1987, was a complete design of a microwave routing tool; including chassis milling, electrical design, firmware operating system, and host drivers)[0]. One of my biggest motivations, is that I “eat my own dog food.” I am usually the poor bastard that needs to back through my legacy, and figure out what I did (in fact, I’m doing that, right now). It has taught me to leave a good legacy [1]. [0] https://littlegreenviper.com/TF30194/TF30194-Manual-1987.pdf https://littlegreenviper.com/TF30194/TF30194-Manual-1987.pdf (downloads a PDF). [1] https://littlegreenviper.com/miscellany/leaving-a-legacy/ https://littlegreenviper.com/miscellany/leaving-a-legacy/
- k__ 6y agoIn my experience there are two types of devs who reinvent the wheel. Those who think they can do better and those who can do better, haha
- strgcmc 6y agoI know this is in jest, but honestly there are two kinds of wheels: round things that everyone uses to roll around with in common/universal ways, and specific configurations of wheels like this person mentioned for microwave routing. You probably don't want to reinvent the wheel that is SSL or UTF-8 or something ubiquitous like that, but there's actually not that much wrong with reinventing the way specific wheels are arranged and designed to work together in a domain-specific context like microwave routing (which I know nothing about). The act of reinventing it will probably teach you a lot about the domain itself, and depending on where you started in your journey, it can be quite fruitful (i.e. if you are a true beginner, then many of the lessons you learn will be things that are already common knowledge; if you are already a journeyman or expert, it's quite likely you might pick up some novel insights in the course of disassembling and reassembling the thing).
- Spearchucker 6y agoThe elephant in the room that 17-313 doesn't addresses is team dysfunction. You know, the guy who insists on agile when you're about to automate a nuclear reactor cooling system. Or the one who insists on expensive message queue tech when async/await is more than sufficient. The bro that mansplains directed graphs at a PhD because she comitted the cardinal sin of being a woman. The infrastructure manager that micro-manages a developer because that manager was too lazy to stand up the test environment on time. We all know someone like that, and after 30+ years in this industry it seems it's worse now than it was in the 90's. Back then all we had to contend with was Windows v. Unix and bastard operators from hell(1). Today it's more insiduous. Often well-dressed, veiled in charm and confidence and hiding behind a big pay check because they're adept at managing upwards. I can deal with it, which has another unfortunate side-effect - other developers want me to manage, I just want to write code. Amusingly (sadly?) these problems(2) were identified in the 80's if not earlier. Books were written about dealing with it (2 and 3, amongst others). But still we allow the behaviour and often organisational/industry culture encourages it (fintech, anyone?). (1) http://bofh.bjash.com/ http://bofh.bjash.com/ (2) https://en.wikipedia.org/wiki/Wicked_problem https://en.wikipedia.org/wiki/Wicked_problem and https://www.amazon.com/dp/013590126X https://www.amazon.com/dp/013590126X (3) https://en.wikipedia.org/wiki/Peopleware%3A_Productive_Projects_and_Teams https://en.wikipedia.org/wiki/Peopleware%3A_Productive_Proje...
- charlysl 6y agoIt does, in the last lectures, see Nov in the schedule: https://raw.githubusercontent.com/CMU-313/CMU-313.github.io/master/lectures/22-Teams.pdf https://raw.githubusercontent.com/CMU-313/CMU-313.github.io/...
- Spearchucker 6y agoWhat's there is valuable for sure. It pushes agile though. A lot. Another approach may be to provide a way for a team to choose a methodology that's appropriate for what's being built (1). It describes effective teams, but doesn't provide guidance on identifying dysfunctional teams/team members, and transforming those to productive teams/team members. (1) https://www.wittenburg.co.uk/Work/Choosing.aspx https://www.wittenburg.co.uk/Work/Choosing.aspx
- miltondts 6y agoI wish people would make more of a distinction between software engineering and software architecture/whatever is currently fashionable. The former is about customers and the latter about the people who write software, and as a customer I feel like almost no software has any concern for me or my hardware. Huge sizes (both in RAM and disk), constant CPU usage and all of this for no reason other than it's convenient or pleasing for software developers. How do we build tools that are pleasing for software developers to use, while using resources efficiently and meeting the requirements? Can we start having that discussion instead of docker, microservices, kubernetes, etc?
- serial_dev 6y agoOn the other hand, sometimes a customer could not care less about CPU usage, memory, and in some cases paying twice as much for cloud services can still be a negligible amount for the business, yet the software developers obsess over efficient code wasting weeks on improving a metric nobody cares about. I don't want to disregard your complaints, they are all valid, but one has to weigh the pros and cons, and in some cases, efficient algorithms are not the most important thing for the business.
- miltondts 6y agoYes! I want tools that do that optimization for us! Better compilers/languages, but with more opportunities for optimizations. Even if it takes a long time to compile I think for most software this would make a lot of sense as it is used much longer than a couple days/weeks.
- AgentMatt 6y ago> software engineering and software architecture/whatever is currently fashionable. The former is about customers and the latter about the people who write software Huh, that naming seems backwards compared to the construction of physical buildings. Architects work on the design of the building (what is going to be built) and interface with customers. Civil engineers work on implementing the architect's design, figuring out how it is going be to built. They work with both the architect (upwards) and the construction people (downwards), but not with the customer.
- revskill 6y agoIt's not about software, it's about business understanding. So i prefer a business-to-software course rather than foundation/principles of building things. To me, software is a tool to actually understand the world.
- wegs 6y agoI'll be contrarian. This is a mixture of: 1) Stuff I'd learn by reading Hacker News, after a few months 2) Stuff I'd learn on the job, after a few months I'm not downplaying that it's important to know, but it's like converting a set of free blog posts into a $5000 university course. Is that an efficient use of student time or money? Probably not. They're better off getting a summer internship, and getting paid to learn agile (and learning it better! working on an agile team will teach a lot more than listening to a lecture), or reading the anecdotes while procrastinating real homework, and posting in forums like this one. It's okay that courses at a university do little to prepare people for some realities. Courses are designed to teach big-O, differential equations, database architectures, the math of machine learning, and similar sorts of things where there's enough theoretical depth that you CAN'T pick up elsewhere. If a software engineer enters industry without knowing linear algebra, odds are they'll never be a data engineer in a serious ML project, or even more so, work on serious ML themselves. TL;DR: Content looks useful, but it's an counterproductive use of tuition dollars and student time.
- ivan_ah 6y ago> If a software engineer enters industry without knowing linear algebra, odds are they'll never be a data engineer in a serious ML project, or even more so, work on serious ML themselves. Linear algebra is a lot to learn[1], but I think it would be possible to pick up the material on the job, given enough time dedicated to it (like a month, not a week). Similarly for pre-calculus (highs school math) and calculus. I guess it does add up though, and if you're missing 5-6x of these fundamental building blocks and you have to fit a year's worth of math learning in between work, meetings, and other life obligations it can be tough. [1] https://minireference.com/static/conceptmaps/linear_algebra_concepts.pdf https://minireference.com/static/conceptmaps/linear_algebra_...
- qznc 6y agoUniversity is important for foundations. You can learn MySQL on the job. You can learn relational databases at university. However, vice versa does not work well. MySQL at the university is superficial, since you never experience it in a realistic production scenario. Relational database foundations have no immediate use, so why bother with it instead of delivering customer value.
- idm 6y agoSoftware engineering was life changing for me. I studied cognitive and computer sciences (CMU '03) - and when I graduated I realized I didn't know much about writing software. Luckily, I found a software engineering course (Berkeley, 2005) after graduating and they let me attend without being enrolled. That professor (Kurt Keutzer) had wisdom! Literally life changing. These engineering skills are totally different from what you learn in a computer science curriculum. I highly recommend a course like the one OP links.
- seek3r 6y agoLooks very interesting but it doesn’t look like the lessons’ recordings will be made available. Anyone can suggest an alternative resource?
- feralimal 6y agoMore 'ethics-free' guidance, thanks! /s Yes, we should care about writing good software, what is a good process, how to best satisfy requirements, etc. But I really would like to see ethical considerations play a role. Sometimes (surprisingly often I think) people should not do the work they are being requested to do. Just because one's boss (and one's paycheck) depends on following a set of instructions, if it goes against one's conscience, what is the point? I mean, someone wrote these 'track and trace' apps. This is to say, they are explicitly enabling the government to track every single move of its citizens. Is that ok? Not to me. They should have resigned rather than play their part in increasing governmental control. Unfortunately, technologists are building the dystopia of tomorrow. 'Smart' cities, anything that encourages use of a 'smart' phone, more data in the hands of FAANG, etc, etc. smart == spy If you are under the panopticon, you are not you any longer. You respond to please others, not yourself. You are in fact a slave. Anything that enforces the hierarchical system, making it ever more restrictive, has blood on their hands in my view. We are designing a future that is less free, less accepting, more rigid. No one wants it. But all those doing the work, are selling out their fellows and even their own future rights, for a paycheck today.
- louwrentius 6y agoInternet == spy Computer == spy Chip == spy
- feralimal 6y agoAgreed. The internet, computer and chips though can be (more) neutral with care. They can serve you.
- eeZah7Ux 6y agohttps://cmu-313.github.io/lectures/08-Ethics.pdf https://cmu-313.github.io/lectures/08-Ethics.pdf
- feralimal 6y agoIs that a joke? I don't care what Harvard has to say about Ethics! Harvard!! The educators of the master administrative class. That ethically outsourced all of the jobs to the rest of the world. It says: Code of Ethics As an ACM member I will .... Contribute to society and human well-being. Avoid harm to others. Be honest and trustworthy. Be fair and take action not to discriminate. Honor property rights including copyrights and patent. Give proper credit for intellectual property. Respect the privacy of others. Honor confidentiality. Fine words! But take a look at the first - "Contribute to society and human well-being." Contribute to 'society'. 'Society' is a fiction. Its not a real thing - its an idea in people's heads. You could just as easily say contribute to stones. People are the only thing doing the experiencing. Individuals. You can say 'society', but this just a way of avoiding talking about and to individuals. Ethics questions are for the individual to work out. And it takes work! And the worst thing is that everyone thinks they know what they mean. That they are ethical. That its others that need the educating!
- profHilton 6y agoHey everyone- I am one of the co-instructors for this course (Michael Hilton). Thanks for all the comments! I’m happy to answer any questions about the class, and I’m always looking for suggestions on ways to make the class better: AMA!
- andrew-nguyen 6y agoThis looks great! Are there plans on making more of this course's content available to non-CMU students (e.g. recorded lecture videos)? Thanks
- profHilton 6y agoThat is something we would love to do in the future, however our current videos have students voices and faces so we cannot release them for privacy reasons.
- carstenhag 6y agoAww, sad :(. The faces are likely problematic, but the voices themselves shouldn't be (not identifiable to a person)
- niklasd 6y agoWhy not? I can't really see the difference, except that identifying a person by face is easier than by voice.
- carstenhag 6y agoYeah exactly, a generic voice is not personally identifyable.
- AnimalMuppet 6y agoMy wife's in a remote master's program. What they did is chop up the lecture. When students asked a question, that was omitted from the online presentation. The result is that an hour of class winds up being, say, four 12-minute videos. That sounds weird, and it can be a bit choppy, but it has advantages. You get to stop and think at the points where others needed to ask questions. You have natural breaking points if you prefer smaller-sized bites. So, I don't know if the students are in all of your video, or just when they ask questions. But if it's only when they ask questions, you might consider this approach.
- dragonelite 6y agoTo explain to my dad(a blue collar worker) at what stage i feel software development is right now. Our collective knowledge is equal to builders discovering a house has 4 walls and a roof. We are still experimenting what sort of materials we need to build the walls and roof with.
- vinay_ys 6y agoI think we don't learn and codify standards from our mistakes in software engineering in the same way we have learnt in civil, mechanical or electrical engineering. I guess it could be because we think the consequences in software mistakes are not as serious/permanent as they are in those other engineering fields. Also the speed of innovation/change has been super fast compared to those other fields. But I doubt if we can keep up this pace of innovation for much longer without the software engineering process becoming the bottleneck. I came across a startup of 50 people in which there were 4-5 different application stacks for server-side micro services – each team had decided to go their own way and there were no standard end to end observability and release management tooling and they were struggling to debug a latency issue – which itself was happening because they didn't have proper parallelization of RPCs and didn't have proper timeouts, isolation etc. This problem of not following well-understood design patterns, or keep stumbling into known anti-patterns (and worse yet failing to recognize them as such even after repeated punishing failures/outages) – I've seen various versions of this at different sized companies (from multi-million to multi-billion $$ ones). And in each case, all decision makers didn't know/have standardized terminology to talk about things, what should have been easy conversations were seemingly unnecessarily hard about what's good design pattern vs anti-patterns etc. I can't help but think that this is uniquely a software engineering discipline problem.
- closeparen 6y agoA lot of the engineering that goes into microservices infrastructure is explicitly to allow heterogeneous application stacks. Paying all those costs in exchange for benefits you won’t use is just a different kind of bad engineering. You definitely want standardization for truly undifferentiated concerns but it can go overboard. If you’re going to use the same application framework in every service, you may not need to separate services at all.
- vinay_ys 6y agoIn most situations, micro-services are for organizing domain-specific functional concerns into decoupled teams/services so that functional domain changes can be done rapidly without risking rippling or inter-locking changes across the systems. The technical stack layer-cake is usually same for all the micro-services – that allows it to be 'micro' and yet be economical. You want less than 20% of your engineering force to be responsible for operating this technical layer-cake while the 80% of the engineering workforce to be productive on actually solving the functional domain problems of your business. What you are referring to is the old-school SOA where each SOA service could be built by completely different companies using different stack and deployed in different environments and yet interact. This is applicable in financial/banking ecosystems (say real-time payment systems across banks/payment-networks).
- halturing 6y agoI'm not a software engineer so this criticism directed at them will probably get down voted. Why isn't security - and that includes secure code - one of the first priorities in design?
- nojvek 6y ago> You may not copy any part of a solution to a problem that was written by another student, or was developed together with another student, or was copied from another unauthorized source such as the Internet. You may not look at another student's solution, even if you have completed your own, nor may you knowingly give your solution to another student or leave your solution where another student can see it I don’t see why Schools are so against this. 80% of my learning came from comparing notes and solutions with my friends. Many times I’d learn something I never thought of and vice versa. I get the “don’t copy things you don’t understand”. Imagine a world where you couldn’t review your peers PRs and learn/give feedback. In many subjects the assignments were so disconnected from the actual lecture notes. It was much efficient to learn from each other.
- nullsense 6y agoYeah. There should be an entire course dedicated to adapting StackOverflow solutions to your problem. Learning from existing solutions and comparing them with what you're trying to do is half of programming.
- philonoist 6y agoWhat are some MOOCs or books I can read regarding software engineering?
- raybb 6y agoI wish there was a good online course like this from EdX or similar.