13 ms·
I know formal education often gets a lot of criticism around HN, but I think the approach the article is talking about is heavily mirrored in most university co
by chrisfosterelli 10y ago
I know formal education often gets a lot of criticism around HN, but I think the approach the article is talking about is heavily mirrored in most university computer science curriculums.
Universities tend to focus on paradigms and patterns, and typically force a student to learn at least 3 languages throughout their education (much more if they want to). Just in my undergrad I learned C, C++, C#, Objective C, Swift, assembler, Java, Go, Javascript, Python, and Haskell. My personal experience is that university grads are much better at adapting to new languages than someone with 4 years experience in only a single language.
That's of course not to say you can't do the exact same sort of education without going to school (and probably in less time).
- sambe 10y agoAgree so much. I had a very theoretical course and am often shocked at how reluctant my peers are to investigate a problem in a language they don't already know (normally just one or max two). Also, if they need to quickly munge some text they'll have a dozen Java classes and several poms. I think this has real practical consequences for decision making (not knowing alternatives etc).
- dargueta 10y agoAlso agree. My programming languages course had me writing code in Racket, Julia, Erlang, Prolog, and Haskell, in addition to the languages that all students had to use for certain classes (C, C++, Java, Python, JavaScript, Assembly, and C#)
- no_wizard 10y agoThis reminds me of something my CS professor/mentor told me once. 'Teach how to program C, you will give them a job. Teach someone how to LISP, and they will keep learning forever' We learned a lot of LISP and Functional based programming from this guy. I mean a lot. Fun times I do miss!
- closeparen 10y agoYes! My university CS program focused on teaching you to think about computation, with the particular language you'd express your thoughts in as an interchangeable detail. Scheme for beginners, Python for web scraping and data munging, C for concurrent network and systems programming, and some small exposure to Java, Haskell, Standard ML, awk, yacc/lex, C++, and your mobile environment of choice depending on which classes you took. Many were upset by this "very theoretical" approach, as they'd prefer to have immediately employable skills in JS-framework-of-the-week. Instead they were taught how to think independently of a particular language, and to get comfortable with learning new ones. From a programming craft perspective, it was a little disappointing that we were never focused on advanced language features or idiomatic code, but I felt I had a solid enough base to self-teach that sort of thing.
- ams6110 10y agoSame with my degree program. Learning the programming language used for any particular class was an "exercise left to the student." After I finished my undergrad degree I had an "exit interview" and I mentioned that this was one of the things I liked about the curriculum, because it helped me see that the abstract computing theory is what is important, and languages are largely a matter of syntax and convenience. The professor's response was that they so often hear the opposite, that students complain that they don't learn languages that employers want.
- nextos 10y agoThe perfect example of this approach is Concepts, Models, and Techniques of Computer Programming. It covers a wide range of paradigms [1] using Oz/Mozart and it also shows examples using many famous languages. [1] https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf
- morgante 10y agoI agree that's what they aim for, but in my experience far too many CS grads (especially from non-top universities) have absolutely no understanding of the core paradigms. Instead, they've basically memorized "this is how I make a linked list in Java." Ask them to do the same exact task in another language and they're totally stumped.
- kochthesecond 10y agoMy experience is the opposite, that those with formal education have a much higher chance of having grasped the concepts, over the language libraries.
- morgante 10y agoYou might have only worked with students from top CS programs.
- gravypod 10y agoI think the top-10 universities do it right and the rest don't. (This is a bit of an exaggeration but you most likely know what I mean). Most of my classmates don't usually "learn" a language. They do an assignment by copying, hammering at the computer, or just asking for help. The basis of how university is set up is antithetical to the learning and exploration of new programming languages. This is based on one simple thing that most universities do and is very easy to fix. Don't mandate a programming language for you assignments If this one thing was done, we'd probably instantly see a much higher failure rate and a much hire quality of turnout. If early on in the curriculum students got a tour of every one of the big name languages and got to just choose the best tool for the job for the rest of their time at university there'd be a much closer approximation to how things (at least for me) work. If one of your projects is something like "scrape a webpage for X data" you wouldn't want to write that in a bash script (which I've been made to do [0]) I'd want to do that in Python with BS4. Or if your project is to write a parallel dot product function you wouldn't want to write that in C (which I've been made to do [1]). I'd want to write that in Julia. Even in my class that I took for exploring programming languages we were forced to use C++. We were writing an interpreter using C++ which I'd rather have done in some Lisp-like languages. Unfortunatly I've not been able to make the design decition to play with other language (in school) to see how they will better impact the development of these applications. I've not had to prototype stuff to see what language it will work best in (in school). These are decitions made for me. I've found that this isn't how things work, at least for me, and I'm the one who is told "Do X" and I pick a way to do it. Whether it's by setting up a spreadsheet it a macro in it that generates the data or writing some real code. I get to choose the most elegant solution and I suffer the consequences then I didn't choose the most elegant solution since I have to my software when it breaks 2 years down the line. [0] - https://web.njit.edu/~sohna/cs288/hw3.html https://web.njit.edu/~sohna/cs288/hw3.html [1] - https://web.njit.edu/~sohna/cs288/hw10.html https://web.njit.edu/~sohna/cs288/hw10.html
- no_wizard 10y agoTo be fair, and I don't have your context on this, but looking at your link of the assignment for [0] it appears to me that this is more of an exercise in getting people comfortable with more advanced bash features, specifically looks like it relies fairly heavy on regex? I agree that BS4 is a better tool for this job, certainly, but there is perhaps a point in what is going on here too. As far as the second one goes, I bet that has more to do with the professors particular familiarity with C than it does an understanding of what the best tool of the job for that is. I'll cede that point :)
- idobai 10y agoMost universities introduce young students to programming with C/C++ and depending on the orientation they'll either learn Java or C#(if the university prefers ms) or JS/PHP. Other languages used to be optional or presented as they're inferior just because they're less popular. Most students won't proceed with functional programming languages if the university concentrates on procedural programming and how to "memorize" the code instead of understanding it. This is how the stackoverflow-copy-paste coders born.
- sbuttgereit 10y ago> Universities tend to focus on paradigms and patterns... > ...That's of course not to say you can't do the exact same sort of education without going to school... I think the personal motivation that someone brings has a lot to do with how they fare short term and long term in this regard. Yes, a good University program will teach you the concepts and underlying theory expressed by language implementations; coming out of such a program you will absolutely have the jump on someone that jumped into JavaScript programming informally. You will adapt more quickly to other technologies faster, too, as you have the essentials to make that shift whereas the JS guy may not. Having said that, if you attended and graduated college because it was something that you were "suppose to do" or because it would get you a good job and computer science was just a way to a good job after college (with no particular interest in the field otherwise)... over time the more personally interested developer that learned JS informally will likely catch up with you and overtake you. My formal education is in music composition. However, I was programming assembly on the old 8bit machines when I was a kid. 20 years on as a technology professional, I devote large amounts of time to learning concepts and theory that aren't strictly necessary for me to program something that works well enough for my customers. I learn these things because I'm genuinely interested in the underpinnings of what I do and because I want to perfect my professional skills... not for an employer, but for my own edification: I care about what I produce because it's me producing it. There are many of my friends that did get formal education in computer science and I've surpassed them in both quality of output and overall understanding. (BTW... don't get me wrong, I have colleagues that have formal education in computer science AND the same sort of professional dedication I have... a good number of them far exceed my knowledge and understanding and I very much look up to them. Still, I'm glad I don't have to feel ashamed standing by their side professionally either).
- chrisfosterelli 10y agoI think that's great, and I agree completely. I added that last sentence because I think at the end of the day your education is what you make of it, regardless of whether you went to school for it or not.
- FLUX-YOU 10y ago>My personal experience is that university grads are much better at adapting to new languages than someone with 4 years experience in only a single language. These benefits seem dubious to me in the long term unless you plan to work on compilers and languages which is certainly a noble goal and is very much a hot area right now. Picking up brainfuck in a short period of time is not really noteworthy IMO. I am also struggling to come up with a way to present this to other people without coming off as an annoying know-it-all. Do we want to value the ability to sprint or the ability to finish a marathon? Plus, your memory will deteriorate over time without constant practice. Am I really going to commit time to reviewing all languages I choose to learn every year or so? The article seems like a challenge-to-take more than career advice. If someone doesn't immediately want to work with languages, I would rather teach them what might be analogous to the lay of the land in our industry: - What tools do you use to make a desktop application on Windows/Linux/Mac? - How do the different browsers (Edge/Chrome/Firefox) implement HTML/CSS/JS? Can you make a consistent behaving application for all of them? And why should you run far, far away from any company asking you to support IE8 in 2017? - How would you make a cross-platform library for Windows/Linux/Mac? - How would you make a mobile application? - What are the most popular IDE options available? - What are the different database options available? The difference in opinion is exactly teaching more engineering vs. teaching more science, but also learning about the ecosystem that drives language choice and development. This knowledge contributes as much to "knowing the right tool to solve the problem" ability as diverse language knowledge.
- chrisfosterelli 10y ago> Do we want to value the ability to sprint or the ability to finish a marathon? We want to value the ability to finish the marathon, which is exactly why it's important to be able to adapt faster. The industry is constantly moving, and someone who can learn new languages and technologies easier/faster is at a huge advantage. For a concrete example, take Objective-C and Swift. Apple has made it pretty clear that's were things are going, and a developer who has C#, Haskell, Objective-C, Python, Rust, and Ruby experience is going to make that transition much better than a developer with just Objective-C experience. This same thing even applies to frameworks within the same language (think React/Redux and functional programming experience). > Am I really going to commit time to reviewing all languages I choose to learn every year or so? Definitely not! You focus on the concepts in the language and don't worry about memorizing anything. Quite a few years ago I learned Go for fun. I basically ignored it after that, but when I needed it for a project recently it came back very quick. Those other questions you pointed out are, of course, very important. I think you learn the answer to those as you learn languages as well.
- general_ai 10y agoI just wish those universities actually produced programmers who understand the low level mechanics of how computers work. I.e. Why your program runs 100x slower if you're not careful about cache misses, pretty basic stuff like that. Moore's law is over, it's time to start caring about performance again.
- dahart 10y agoWhat makes you think universities produce people who don't care about performance and aren't educated about low level mechanics? That's an honest question, I'm not challenging your experience. I don't know what your experience is, of course. In my experience, people with CS degrees do understand the low level mechanics statistically more often, on average, than people who don't have a formal education, or people who go to 2 year colleges or trade schools. There are definitely people who make it through a degree without thinking much about cache misses, but in my life I've seen far more programmers without an education fail to understand caching than programmers with an education. I've never met anyone, educated or not, that doesn't care about performance at all. I do meet people that prioritize what they care about, and choose to weigh performance of the programmer over performance of the computer, choose to prefer working with valuable abstractions over milking every cycle out of the machine. It depends on what you're doing. Usually, thinking about CPU cache misses in a web development environment is premature optimization and a massive waste of effort. Not always, but usually there are other more important performance considerations.
- general_ai 10y ago> What makes you think Personal experience. I've been trying to hire moderately competent, junior software engineers would be able to write and optimize C++ without much supervision. They're now more rare than the Sasquatch. Today, "caring about performance" means picking a language that's only 5x slower than C, rather than 100x slower. Hardly anyone even knows why alignment might be desirable, or how long it takes to fetch memory after a cache miss, or how concurrency primitives actually work. For my generation, "caring about performance" means that C compiler generates suboptimal assembly, and you handcode it because you know better and need that extra oomph. > It depends on what you're doing It sure does. You don't have to worry about the lower level stuff every day. We deal with extremely high performance code, and even _we_ don't think about it every day. But it definitely pays to know what's going on. Otherwise it's not software engineering, it's cargo cult science and rain dancing, prone to fall apart at the first sign of difficulty. It's like having a certified car mechanic who doesn't know how to open the hood. You can have a few of those to change tires and broken tail lights on the cheap, but you also need the dudes/dudettes who know what to do when "check engine" light comes on.
- giancarlostoro 10y agoMine was a little less about patterns in some cases (2 year school though) and you got to take plenty of different programming classes from Web, to C to C++, Scripting Languages, C#, Java, and others. After it all I somewhat try my best to be language agnostic, with sane reasoning, I will raise my concerns if I know the faults of a language. It would be silly to just code in any language asked to and never raise concerns or offer alternatives if they fit your workflow better.
- pjmlp 10y agoYes, when I graduated in the 90's, we had Pascal, C++, C, Prolog, Caml Light, Java, PL/SQL, Assembly (x86 and MIPS), Tarski's World language, Lisp, Algol, PL/I. Those like myself doing compiler related classes got to additionally explore Forth, Oberon, Oberon-2, Active Oberon, Modula-2, Modula-3, Eiffel, Ada, Concurrent C, Objective-C, *Lisp, Sather, C+@ [1] among a few others I cannot remember now. As Wirth puts it, it is all about algorithms and data structures, in an abstract way. [1] - In case you never heard about this obscure relative of C++ at Bell Labs, http://www.drdobbs.com/article/print?articleId=184409085&siteSectionName=cpp http://www.drdobbs.com/article/print?articleId=184409085&sit...
- renox 10y agoI agree: in my French school we had to learn assembly language, C, Prolog and Lisp. Clearly Prolog and Lisp were taught to us for the different paradigm they introduce not because they expected us to use Prolog and Lisp in our jobs..