There can also be a bit of an attitude, like the person is thinking "of course this is good, I went to Stanford". But maybe that's my imagination. Another explanation is that these people are just so good that they are able to read messy and convoluted code no problem, and us mortals need to step up our game.
On the other hand, these people would easily be able to reason about complex performance and security issues beyond me. I think that the hardcore CS issues are a science, while writing clean code in a web framework, browser, and API design is more of a craft.
If you hire too many computer scientists, your code base could be full of fascinating technical tricks, but creaky and hard to work with. Too many craftsmen, and you'll get stuck on simple problems. It's a balance.
EDIT: Downvotes? Please explain. Perhaps I am not able to fully comprehend the issues at hand.
It's a simple question of motivation. If they're brilliant and they have motivation, then of course they could write great software. They just don't.
Make no mistake, people from schools like Cal Poly SLO (a state school, and my alma mater) who excelled in their CS programs can software engineer circles around most. Why? Because Cal Poly has no research program, three quarters of their faculty come from industry, and their faculty have no job requirements outside of teaching. They literally had us managing five to ten thousand line software projects with teams of students in year two.
Even currently, a tremendous amount of the cutting-edge work in optimization and others is done at the university level: METIS for graph partitioning, and convex optimization work being done by Stephen Boyd et al. They care deeply about the implementation because quality and speed of solution are of utmost importance. A number (like Geoffrey Hinton and Sebastian Thrun) have moved into the private sector, but after contributing a lot via academia.
Our EE program has something like that where you choose a team and build something with them over the course of a semester while having an "advisor". At the end you make a report and present it to the advisor and the rest of the committee. It's a requirement for graduation. I think that's awesome and CS definitely needs something akin to that.
I studied a bachelors in molecular biology, took a few years out (realised I didn't like the subject much) and studied a one years masters in IT a few years later. It was taught by the Computer Science department (Glasgow University in Scotland), but the focus was on writing good quality software - readable, maintainable, usable code.
There was an optional data structures and algorithms course which I assume is more geared towards traditional comp science. I took it, but in ten years of work, I rarely use this stuff (though its good to have a background so you know which library is a better choice).
One thing they didn't teach us was networkinq, which I am completely self taught. I can get stuff working, but I think having a formal education in things (like I do in OOP) can teach you where to focus to get things done in a professional manner.
- 1.5 years experience isn't very much to base an opinion like this on
- Finding other people's code hard to read is pretty common, no matter how good those coder's are. Your own code generally makes perfect sense to you, same as your writing. But communicating so that all can understand it is hard. That's why flame wars occur. You probably think your comment is a reasonably argued piece of writing, just like you think your code is nicely refactored and understandable. The fact that people disagree and downvote proves the point I think.
I would have ignored your comment were it not for you mentioning that you write javascript. I started learning it on and off a few weeks ago, and yesterday I installed spidermonkey as a standalone shell. What I have noticed is that a lot of the syntax that controls flow is very similar to C, which is notorious for being gibberish. I'm guessing the same will apply to js. I do not have a CS degree, but would you say that this is readable? This is a function for extraction of nodes in a double linked list that I am currently kicking into shape.
/*
* extract *p__ from p__.
* but original *p__ is shifted left or right \
* if there is still space.
* extracted ndi* is returned, but the remainder of the list \
* is sewn back up.
*/
ndi *extract_ndi(ndi **p__, const int dec) {
ndi *q_=*p__;
if(dec>=_PREV_) {
*p__=*(q_->lnk+dec); /* the shift */
if(*((*p__)->lnk+!dec)=*(q_->lnk+!dec)) { /* sew up */
*((*(q_->lnk+!dec))->lnk+dec)=*p__;
*(q_->lnk+!dec)=NULL; /* burn ends of extraction */
}
*(q_->lnk+dec)=NULL;
} else if(dec==_LONE_) /* final possibility is that *p__==NULL */
*p__=NULL; /* ie. dec==_DEAD_, no which ain't it not worth man */
return q_;
}
What the hell was I smoking when I wrote this? I can't even read it myself.Writing convoluted code is more to do with a certain state of mind. You should ask your coworkers where they obtain LSD, not where they got their degree. I haven't come across any acid for about a dozen years, I think it has gone out of fashion.
Of course if this was Perl it would be even worse.
It's what you get for being lazy (non judging here, I'm guilty of it too) and not naming your variables accordingly. When you write the code you probably know what ndi, q, p, lnk, etc. are supposed to mean. But then you leave the code for some time and when you return you are lost. Just write out variable and function names so that your code reads like english - programming Obj-C for some time really helped me there :)
And with pointer-heavy code I tend to create aliases for offsets so I don't have to write out things like *(q->lnk+!dec) every time I reference that specific address.
Yes, maybe it will cost me wizard points with colleagues because they start to understand my code but my sanity is it worth to me ;)
(Also trailing/leading underscores are the devil!)
Sigh. Sadly, it has become fashionable to bring up Perl only to ridicule it even when there is absolutely no context or need.
Take a look at this implementation [1] of doubly linked list in Perl. Tell me how that is worse [2].
Now, I will go back to my corner to being productive using Perl or whatever language I need.
[1] https://metacpan.org/source/LEONT/List-DoubleLinked-0.003/li...
[2] Of course, I have no way of knowing if it is an exact or even close translation of your code, but it does implement doubly linked lists.
Your whole post is full over hand waving and overgeneralization. You've never met a CS major who wrote clean code without resorting to fascinating technical tricks? You haven't met a non-CS major who did his or her due diligence to learn the mathematical fundamentals?
Please cut the hyperbole.
Be careful, everybody writes worse code than you, because you wrote the code. And these is a difference in writing nice simple code, and rewriting the same function to work on a bunch of different machines that does the core of the application, and you have until the end of the week until it goes live.
Best practices are easier to digest when you've experienced the problem they're meant to solve.
After enough projects, you get used to navigating codebases that are layered with multiple styles and grungy bits from years of effort. At that point, you have some hope of knowing what can and can't be maintained.
There's a difference in approach between academic CS and practical software engineering, yes, but a decent CS grad should be able to pick up both.
Sounds like you worked with people who just weren't as good as they thought they were at that part of it :)
I graduated with the equivalent of a minor in CS. When I started coding for an web-based gaming start-up in 2007, it was mostly irrelevant. You don't need a CS degree to learn Ruby on Rails, nor is it necessarily useful (beyond your basic intro courses) to have taken CS courses.
Flash-forward a year, after we raised our seed round. Our online game had grown in complexity quite a bit, and we found ourselves having to deal with things like complex image rendering, AI, and pathfinding. While it's possible to get a decent grasp of these topics through Google and O'Reilly books, it's definitely an order of magnitude more difficult than figuring out a new web framework. As mentioned before, I only have a minor in CS so my exposure to these topics was minimal, and there were definitely nights where I found myself wishing I had taken another AI or advanced algorithms course.
Why not just learn these areas when needed? Taking an Advanced AI course in just a 2-3 month semester is how many hours? Just spend a week or two hitting the books and you'll be good to go, and you're knowledge will be bleeding edge and up to date. Plus, you'll have been paid to learn it!
Most importantly, you have a much greater chance of knowing when a solution exists and where to look for it, and more importantly know when no solutions are known.
E.g., the computer scientist recognizes the travelling salesman problem even when it doesn't involves salesmen, travelling or cities. She knows that it's NP-hard so she doesn't spend a few months trying to find an efficient exact solution for her millions of nodes, but she knows where to look to find "good enough" solutions for the problems she is trying to solve.
The autodidakt might not even recognise his problem as a TSP and thus doesn't even know that her problem is hard and which books she needs to start reading.
If you have a very solid understanding of the fundamentals, you should be able to go and solve problems you've never seen before. If you don't, you could be stuck using other people's solutions to your problems, hence not being able to solve new ones that you might encounter.
Believe it or not, some people pick up merge sort or balanced binary trees faster than they can learn Rails (which has a BIG amount of content to master, by the way).
The terms coding and computer science do get used interchangeably by a lot of people though, since most may not understand the difference. I've learned to live with it (occasionally I point out the difference, if I think the person misusing the terms actually cared to know).
For example, CS also includes Psychology, Graphic Design, social science, art, etc.
Also, CS involves the teaching of programming, which is a craft (ignoring edge cases) - crafts cannot be taught through maths alone.
1) Many of the top coders, programmers and data scientists that I know don't have CS degrees. (The top coder I know never finished school. He could move from Assembler to C to Objective C effortlessly, and could do everything from games to operating systems. He wasn't lacking for theory or versatility)
2) Despite this, a Computer Science is more difficult rigorous than most non-engineering degrees. Even at open admissions schools, getting a CS degree means being forced to solve difficult problems.
3) Because of #2, a higher % of CS majors make good programmers than most any other major. (I've seen English majors make good programmers, but at a much lower %)
4) Despite #2 and #3, there are still many unqualified CS majors.
5) There is no typical CS programs. Some are very flexible, some very structured. Some have an engineering focus, some are part of liberal arts schools. Some are too narrow, some are not specialized enough.
6) A few years after college, your grades don't matter. A few years after that, the school doesn't matter. A few more years and your major doesn't really matter. At that point, it's all what you've done with your time. (Though it can help to say, "I have a CS degree. I used to be technical.")
in a data structure class,you learn the basic structures like PODs,structs,vectors and linked lists.
in algorithm class,you learn various basic sorting algorithms plus the big O notation and thats pretty much it.
Then you will take a few physics classes,then chemistry classes,then maybe calculus one and two,then probably discrete mathematics class,one or two writing class,if you a lucky,maybe a single semester of operating system class.
you may learn the basics on haskell in one class,the basic of java in another,maybe assembly in another class and you get your degree.Basically,you will leave school knowing only the basics of a bunch of things but not enough of anything.
The above it how it felt to me as a CS major.
Stuff I've done in the real world:
AI: I've lost count of the number of times I've had to implement A*
Graphics: wrote a ray tracer; matrix transformations
Data structures and algorithms: wrote an approximation algorithm for the travelling salesman problem (christofides); fancier data structures like bloom-filters, lru caches; and just every day coding
Databases: query optimization
OS: Made me aware of systems (context switching, caching performance,...). Scheduling algorithms and how they affect the embedded software I write. Concurrent programming.
Networking: Super helpful for everyday stuff when you understand the underlying principles. I've had to implement an RFC from scratch (DNS).
Linear algebra: Used extensively in a path planner I wrote---with it I was able to reduce the state space by orders of magnitude compared to the standard grid approach.
Statistics: wrote an online algorithm for adaptive windowed linear regression
Even computability theory has been helpful, as it has strengthened my proving and reasoning skills---helping me find holes in requirements, or proving algorithms/invariants. Same with all the theoretical math courses I took (Analysis, Set Theory, First Order Logic ...)
The list goes on...
Above all, my CS degree taught me how to learn CS and beyond.
Sometimes I worry about the potential solutions I am overlooking, because I never fully branched into the continuous domain (control theory, etc).
FWIW I switched out of CS into Mathematics after one year. I've never implemented A*, I've used raytracers but not implemented my own, used a bloom filter but not implemented it, used an lru cache but not implemented one, used adaptive windowed linear regression but never implemented it myself. When optimizing database queries I've never needed more than EXPLAIN SELECT; when optimizing performance I've never needed more than a language-level profiler. I did actually implement an RFC from scratch (SMTP), but that was easy enough to do by, well, reading it and implementing it.
You know, I keep hearing that, but nobody has ever been able to convince me of it. Those are, indeed, the things that fall sideways out of "computer science" (for want of a better name), but it's a near-equivalent to the statement fundamentally, fluid dynamics = boats and airplanes.
"Computer science" is about developing a method for reasoning about process. For the most part, we're still stuck in a world where intuition plays a larger role than it ought to when developing processes, both in the computing world and in the physical world. Investigations into process have yielded algorithms and heuristics (what to do), of course, and those, in turn, depend upon data structures (what to do it to), but we're still pretty much at the level where we're dealing with specific instances rather than a more general formal language. Chemistry without knowing much about the atom yet, in a way.
What you learn in school (at least at the undergrad level) is "here's what we've found out so far" (as it is in any subject). And while that can be a big help, allowing you to more easily recognise classes of problems, there is still more intuition than reason involved in attacking the really hard problems. Both "software engineering" and "computer science" are about reducing the amount of fuzzy, squishy, intuitive parts, but in different ways. "Software engineering" is about robust application (finding and understanding the use of the equivalent of "materials" in the field); "computer science" is about understanding the fundamentals of process (and may well extend beyond computing).
It wasn't until getting into the "real world" that I realized the full value of my data structure courses. Those were the ones I kept returning to when trying to learn and understand new skills on the job. (Sadly, my 2-year degree didn't cover any algorithm learning.)
So, now I have the advantage of a few years of "real world" experience to try and plot a course for how to get formal education on the remaining pieces that seem to actually have direct correlation to a career in computer programming.
Not sure if it's a blessing or a curse for me, but I just have to keep moving forward.
As you work with more and more people in this industry, you frequently run into people without a degree, or, more importantly, no true know how, as I do stand by the fact that it's not required to have a degree to learn this stuff, who behave as if they are experts regardless of their poor mental model of how computers work.
It's important for these people to know what they don't know. Reminding people that Code is not CS is a good way to make that happen.
According to wikipedia:
> In 2000, he graduated from Colorado State University with a Computer Science degree
I suspect, like with most fields, that the school definitely matters (and that he may not have arrived at the same conclusion had he attended a school with a better CS program)
Have to agree with this. How good you are at coding is more related to the number of hours you put in than grades or school. People who enjoy coding have the advantage of being able to spend more hours before getting tired/bored, and thus become better coders than top CS graduates who are just trying to pass college.
• Computer Science = Truck
• Treehouse = iPad
But how do you make iPad dev tools?
The same way you make a real-world video editing suite work on an iPhone and have the guts to make that your seasonal and campaign: in a careful and considerate fashion without trying to be all things to all people.
That said, if I had an editable Chrome dev tools on a tablet I'd be 50% of the way there some days. :)
And ... Don't read too much in the car/truck comment. Eventually even smart phones will behave like supercomputers. It's just a matter of time.
If you feel you got nothing out of your education or that your education was mostly worthwhile, that may not reflect on computing science in general but just of one particular implementation of it.
In fact, I see this title as the wrong way round, it should be: computer science is not coding. Too many people think codes know all about computers. In my experience, they dont. They have a limited skill set. Just like support staff who usually cant really code.
Having a CS degree myself, I have always felt at an advantage over people who, for example, only program but know knaff all about hardware, OS's, servers, etc, and support people who only have things like MCSEs, and don't know the low level fundamentals.
For me, having a CS degree makes me a jack of all trades, all be it, master of none.
Computer Science is generally focused on algorithms and math, but the emphasis on coding varies across universities -- some are way more math heavy, while others have more software project work.
A few universities have a separate Software Engineering degree, like Cal Poly SLO. The emphasis is on the process of software development and applying computer science fundamentals to a product. This is the job of gathering requirements, designing a piece of software, and, often, actually implementing it.
SEs have to know how to structure software and put together data structures and algorithms, integrating knowledge of the hardware (and underlying layers, like the OS) that the software is running on. Computer engineers and electrical engineers make the hardware and everything lower than the OS. Computer scientists have to know how to develop new data structures and algorithms. Making software requires the work of all three professions.
I think there's a huge difference between "learning to code" and "learning to become a software engineer," or "learning to become a computer scientist." One can learn to code without a breadth of domain-specific knowledge, which obtaining a degree may give you.
I know, because I have a mastered in CS and considered getting my Phd. I decided to join industry instead, because I wanted more money. I hardly use any of my CS knowledge on a day to day basis working as a web developer. Yet I make $160k in my mid 20s while my 60 year old professor has never cracked 6 digits... It's sad in a way, but to each his own I guess.
If someone told me now that I can spend 4 years just learning things, have access to intelligent people, and great resources/facilities without worrying about a gap in my cv, I would jump at that chance.
I am going to hacker school in Feb, so hopefully it will be kind of like that. Albeit for a much shorter amount of time (3 months).
The only way you can reasonably believe that college was "a rip off" is if you didn't have ANY fun that whole time. If you can honestly say that, then I am sorry. You allowed a part of your adolescence become robbed by people who told you what to do. But if you had even an ounce of enjoyment throughout college, if the idea of learning computer science made you smile even one bit, then it was absolutely not a rip-off or a waste of time.
"Your time was not wasted if you were happy" - John Lennon
Having a CS degree won't make you a genius, or guarantee you write beautiful code.
There are 3 factors at play. Brains, Fluency, and Theory.
If you have good theory you won't spend 100 years trying to figure out things people already have figured out.
If you have good Fluency you will write like people in that language write. "Your code is very Pythonic".
If you have brains you may solve a problem no one thought was possible.
I don't have a CS degree, but I'm a "grey beard" as a result I have good theory. I don't speak Python as a first language, or the language I think in, so I don't have good fluency. As a certified Genius I have a big brain and often solve things people didn't think were solvable. So I make up for a lack of fluency.
Seriously though, I like the assessment. I've worked with people from all three camps. Everyone has their pros and cons. I work in the medical space and end up spending a lot of time with more academic types.
In my experience they haven't been the best "architects", but they have been great at solving tough problems and writing code that does what it is supposed to do. I work with them to develop it, and then I take our code and integrate it in a way that allows us to maintain it more easily over the years.
My role at Microsoft was as Subject Matter Expert. SME's don't write "much code" but we tend to prove problems are addressable in code and build proof of concept code.
My current role as CTO I work in python which is not a language I have been doing for very long. I struggle with Lambda's and List Comprehension, often opting to use slower constructs that a less experienced developer would use. But the logic is solid.
I also often am completely with out error handling, and just say. "Well duh, if you try and stuff HTML in my text field it breaks." or "Why did you use curly quotes I'm not handling your Unicode".
Part of that is "not knowing" because I don't do it 40 hours a week, and part of it is that it is cheaper to have other fix my code than it is to tie me up adding all the error handling and input validation.
Computer Science is more than just coding. It involves graphs, complexity, math, theories, and much more. Which is a lot. And is hard.
Like math, anyone can do math. But not anyone can be a mathematician. Anyone can code, but not anyone can be a computer scientist.
Nowadays academia is under ever increasing pressure to produce fit-for-work experts, and seen from such a perspective it really can look pointless. I personally strongly disagree with such a view. IMO, it should appear to be pointless! It should broaden your thinking and introduce you to the cutting edge of the field, not just specialize you for a certain line of work. There should be programs which will do only such a specialization, but a full-on CS course is supposed to be more. In the end, how well you will work will depend on a lot more than just the school, but a good school will help.
The Law of Leaky Abstractions is, perhaps, a good argument for why it is useful to learn all that theory even though in practice it is rarely needed. Sometimes, you just need to know what is going on behind the scenes.
P.S. I always have the feeling that the Dunning-Kruger effect is strongly present in these discussions. The first programmer that I heard claiming that a degree is useless is also the guy who didn't know what a DB transaction is for and when he should use it. It's not a huge deal, we fixed the bug, taught him, and then he knew. But - not knowing such basics, how could he possibly know what else he is also oblivious about?
We need good schools to teach us that we don't know shit.
Personally, I would advise young folks who are already passionate about programming and technology to either go all-out in a true engineering field or pursue something that will equip them with a very different skillset. For example, if you have programming skills but get a degree in business and focus on accounting, you could easily be the most productive member of your department. Meanwhile, you'd have the savvy and knowledge to spin up your own side business doing software consulting or, say, mobile apps.
I would go so far as to say that, assuming you are motivated and already coding and have a decent math background, a CS program isn't worth it unless it's from a really, really good school.
The two skill sets don't overlap entirely. However having the latter generally makes mastering the former somewhat easier.
I need someone to please explain this last bit to me. He seems to suggest that it's pretty easy to become a software developer. This idea seems to be pretty common across hacker news. That all it takes is a little bit of research, and anyone can get a job as a software developer. Is this true? I've been trying to change my current career path from engineering to software development, and I cannot seem to get any conversations started. Does anyone have experience changing their early career paths and how they went about implementing the necessary steps?
With an engineering background you already have a good foundation in problem-solving. I would recommend learning one language really well first. I like Ruby or Python for beginners. Javascript is very practical, but I agree with the other folks in this thread who compared it to C. It's lack of structure make it a hard first language. Then find a small open source project to get involved with. A lot of open source coders will happily mentor you if you put in the effort to contribute -- you can start by contributing docs and good bug reports. Get started, see if you like it. It's not easy, but it can be done. For me, it has always been fun.
By the way, I'm a she :)
Anyways, I'm already pretty well versed on that basics of programming. I think the key, as you pointed out, is to get involved in an open source project to build up my portfolio. Python is the language I prefer, but I use vb.net to build the tools I use at work since the .net framework provides a great interface with the microsoft products corporate office workers are slaves to. I'll start searching for local open-source contributors.
People learn what they learn, formally or informally, and then they either develop a passion for what they learned, or not. Not everyone who studies art can produce artwork most would enjoy, much less a masterpiece. And, in this regard, having encyclopedic knowledge in the field isn't a solution.
What I am saying is that it is about the person, not the encyclopedia. Developing artistry requires knowledge, passion and dedication. Knowledge alone isn't the entire equation. Knowledge without passion and dedication is useless, no matter where it comes from. And this might very well be the reason a lot of CS grads falter.
I've worked with many people who, while presumably listing Microsoft Office skills on their resume, spend time with repetitive tasks in Excel that could be done in minutes or seconds with a formula and a click-and-drag.
I've found that the hardest part is finding the best way to tell them that there is an easier way without being condescending or making them feel foolish. I usually go with "Hey, um, can I show you something?" But ideally this opens the window to realizing that you can make Excel (and computers in general) do stuff for you.
On the other hand, if your background is top-notch computer science you just may suck at coding ― which would be just ok except that I suggest that not many advances in computer science happen unless the dilemmas at hand stem from practical programming problems, after which they can be explained and modelled theoretically and theoretical solutions be devised.
It reminds me of the old xkcd: you can get by without it, but the fun things in life are always optional.
And that may be the case, but that attitude places CS on a pedestal that most people feel is out of their reach. As such, when they use CS fundamentals in their day-to-day programming job, they don't really feel like they are using CS. They're just coding.
Similarly, I think people hold similar attitudes about math. Arithmetic isn't math. It is what elementary school students learn. Only mathematicians with chalkboards full of unintelligible symbols dreaming up formulas that the world has never seen before use math in their job.
Does a CS degree make you a better programmer? Most certainly it will! It will give you an optimal background on which you can build solid knowledge. But you can't be 100% sure about that either.
Can you learn everything and more than a CS laureate by yourself? Of course you can, especially today that information (mostly about technology) flows free online. You can order books from amazon (Knuth anyone?), etc.
As my genius Math professor once said: "When you come to the oral exam session, I will ask you a question. In 99% of cases, the answer is: it depends..."
In my experience, mentors matter more than the course title. I've had the privilege of being taught by some of the best teachers and witnessed some of the worst. When your instructor deals with the course material as the sole purpose of a student being in class then the important lessons of computer science become nothing more than an exercise in regurgitation. However I've had my eyes opened by certain individuals who showed me what mathematics means in real life, how algorithms fail, why project management is important and how it's done and even how all coding has a mathematical basis (like SQL and compiler decisions). Personally my CS appreciation was a byproduct of being in the presence of these mentors rather than reading a book. They showed me the essence of the science. Mind you I love the books and still read my university books sometimes for fun, sometimes to brush up on the science after getting rusty.
Code people, should be open to learn theory when needed.
CS people, should be open to understand that writing code is not marginal and takes a lot of time to master.
Probably more cooperation would be needed.
Programmers who don't know CS are programmers who are less educated in the theory of their practice.
The example I tried involved moving angry birds and zombies around on the screen, and it required a bit of thought. It wasn't rocket science, but it wasn't a walk in the park either. This movement will be successful as long as the right resources are available.
...and have seen many, many 1.0's, shelfware, etc.
A CS grad from a top-flight school with excellent experience is worth their weight in gold, at least on teams of multiple people developing big systems - you want at least one, they will take care of data design, software architecture, etc., and likely cause your code to be more robust, more maintainable, etc.
But motivated college grads (I'm Canadian, not sure what the US term would be), talented engineers, and autodidacts can crank out code like nobody's business. I don't know that I'd want to built a multi-year "core services" library out of it, but PoCs, MVPs, 1.0's, and demoware? Why not? And the top-flight CS grad might be wasted there.
I'm torn because I care about quality, but really high quality only matters for the really long-lived system, the health-and-safety-critical system, and the system that must survive on its own with minimal human intervention and maintenance.
Were I building a radiation control for healthcare, I would want electrical engineers and CS grads from top-flight systems. Ditto military avionics.
If I was building apps, apps, apps, servers built atop well-architected OSS libraries, etc., I'd want code, fast, and I'd balance quality Vs lifetime to maximize profit, and probably hire less experienced, less well trained devs who "give good face", understand requirements, and code fast.
The libraries themselves? Good question....
I don't have a conclusion. But j45 is right, customers don't care so much - but they don't want 3AM bugs, either. It's a trade-off.
- Being reasonably kind to your future self without over engineering or over architecting is the real skill of a talented developer/engineer in my eyes.
- All software is like hardware, no matter how it's built, it has it's limits that will likely have to be revisited.
- Customers not caring about which language/framework something is made in doesn't mean the code is automatically unkept or made carelessly.
- Most languages and frameworks are pretty capable. All have their tradeoffs of what they uniquely provide vs give away. Very few projects will critically fail or succeed solely from the selection of a particular framework or language.
- I'm not sure if you're connecting customers who don't care what language their system is built in, causing 3 AM bugs. If so:
a) 3 AM bugs are not a cause of any particular language of framework or language, or the customer not caring about which one, but rather, the developer.
b) Bugs are a reality on all platforms, and are best insulated against by a combination of process, policy and strategy that can be reasonably implemented in any stack.
Ultimately, it's about how the user feels and the value that provided to them in solving a pain.
Customer value is NOT the same value the developer provides themselves to make the developer's own life easier and somehow believing that all the build tools in the world will solve the customer's problem any better, or make a difference for the end user. It's not as often as it seems.
Most languages and frameworks are capable of delivering delight if the developer spends time focussing on the user's pain and not just their own pains in their stack. Looking at how much value HN provides, it's not a function of it's language, framework, or coding.
Maybe like inter-faith, i'm an inter-platform kind of guy as a polyglot and see the good everyone can be doing instead of dividing among syntactical philosophy that is indistinguishable to the users in the end.
That observation is not restricted to coding or comp sci.
The physics of microelectronic devices Machine language C Data structures Sociology Psychology Anthropology Literature Politics and Activism
College is an opportunity to learn. Whether you seize it or waste it is up to you.
[edit: just want to add that the OP makes a great point]
I'm not sure it's worth the workload!
You will have _no_ free time and get reamed in GPA
Very math-heavy and the project based classes were brutal.
Also personally I felt like this is an exceptionally competitive major (as are sciences in general) but I'm sure that's true for other schools as well. It's okay to get a B -- you're being compared against other brilliant people and plenty of people would be lucky to hire you. This is probably the one piece of knowledge I would have told myself 3 years ago when I started it.
I studied Economics, so I had to figure out how to code (still at it) by relying on the internet and experimenting. Doing things that seemed interesting. I didn't study CS because at the time it seemed impossibly hard, so instead I focused on learning by reading books, experimenting.
I have friends with computing science degree yet they cannot code or have shipped software. Ironic that they cannot work as a software developer but it's the same reason I feel about my Economics degree (not working as an investment banker as I'd dreamed but thank god). Rather their theoretical knowledge in computing science degree seemed to limit their true potential to realize coding involves a different part of the brain then the ones used to pass final exams.
I often find the computing science questions in job interviews puzzling. How does the ability to recite an algorithm from the textbook translate into being able to ship code? How does one learn how to play a concerto by simply reading a book listing instructions and being asked to recite specific pages? It's my belief that coding (in terms of shipping software) is a highly organized and rational form of art. You are writing words but it's strictly limited to what the creators of the programming language have selected. How you form the sentences that the computer can understand really comes from trial and error until you've become familiar with it.
So do I, but CS degrees are not about memorization. At least not in North America or Europe. For my CS degree, I had to follow the math and deliver code. Toy code of course, but its a long way from "recalling and reciting references." If it had been about memorization I would probably have failed.
I also know people who say they got CS degrees through memorization and the ability to recall and recite references. They are Indian and Chinese. And they can code (even if they believe their degrees do not help.)
Of course you can't memorize your way through a CS course requiring you to write code, but my point is exactly that, school doesn't teach you to actually be able to ship code or write something. It's something one must discover on own terms.
I find that quite insulting. This may be true if you go to some shoddy university that teaches things by rote and memorisation. I did an engineering degree where we had practical laboratory sessions that required you to build experience to get a good mark and the exams were not about remembering formula, you had to apply the knowledge that had been taught.
Experience cannot be taught. However, a good teacher will teach you a lot of useful skills that help you acquire experience quickly. I have learnt foreign languages where I have done a lot of studying at home but with much less opportunity to practice using those languages. When I visited the countries where they spoke those languages I struggled at first but it didn't take long to recognise the differences between my self practice and the real pronunciation/way of using a phrase.
Frequently we see these posts that say you don't need a degree to code. It's true, but if you have a good degree in programming then it's so much easier and probably your code will be much better because you know why things are done a certain way and you do them properly.
The real world does not work like this, and often I find that academia prepares you for a world that doesn't behave or exist like the ones described through courses and lectures which are only aimed at grading and evaluating on some set of criteria. It's not necessarily an accurate meter of how you will adapt your knowledge and skills in the real world, I belive Nassim Taleb mentions the concept of 'empty suits', or so called experts who focus entirely on a constructed model of the world they are absolutely convinced will not change with lack of accounting for black swan events (an event that is unexpected and debunks a widely accepted belief, for example swans were thought to be white until the discover of black swans in Oceania) and basically the society attributes an irrational amount of trust and credit in those that have gone to the best of the schools in the best of what they do, not necessarily based on the inevitable nature of change (earth was flat, now it's round) upon random discovery that challenges what we've accepted as "facts".
It's a question of realizing you are being taught how to think and what to think by the institution that measures efficiency on a normal curve, instead of discovering the process and the target yourself.
Now of course, university life is much bigger than just lectures and learning, you meet so many interesting people, you learn that there are more questions than answers, and I think that is the best part. Maybe if you've gone to an Ivy League, you will find yourself surrounded with individuals of influential and powerful families which you can expand your social circle for future business and collaboration and that is all the more reason to go to one, but then I question the ability of someone with middle or lower class status to be genuinely accepted amongst those that have it all already.