TE
科技回声
首页24小时热榜最新最佳问答展示工作
GitHubTwitter
首页

科技回声

基于 Next.js 构建的科技新闻平台,提供全球科技新闻和讨论内容。

GitHubTwitter

首页

首页最新最佳问答展示工作

资源链接

HackerNews API原版 HackerNewsNext.js

© 2025 科技回声. 版权所有。

Ask HN: What's missing in a CS degree?

29 点作者 kunqiana将近 15 年前
There seems to be lots of post both recent and before discussing the inadequacies of a CS degree. Could anyone elaborate on how to fill up this gap for better preparation in the real world? What would a person who wants to start a start up need to learn on his or her own? Also, what about open source contribution. I realize most answers would probably follow along the lines of "work on your own projects." but I would like more detailed advices based on your personal experiences. How much work is there left when just out of school? What did you do to fill that gap?

27 条评论

jgg将近 15 年前
A nice start would be actually teaching <i>Computer Science</i>. Computer Science is a branch of mathematics, with both theoretical and applied aspects. This does <i>not</i> mean that learning Java syntax constitutes as "applied". I think it should be expected that CS students pick up languages on their own in order to complete and understand theory-based assignments. Anything else is probably just pandering to people who shouldn't major in CS. This doesn't mean programming projects are entirely out; if they serve to reinforce understanding something like logic programming or pointers, then by all means they're useful. The "open source contribution" and whatnot should be done on your own time, and doesn't belong in the curriculum, period.<p>Remember, you don't major in Physics to learn which brand of concrete you need to build a bridge. Not teaching a concept because it isn't "used in industry" is a sickening corruption of what academia is supposed to be about.<p>See my comment here: <a href="http://news.ycombinator.com/item?id=1345596" rel="nofollow">http://news.ycombinator.com/item?id=1345596</a>
评论 #1391824 未加载
评论 #1391831 未加载
评论 #1391797 未加载
评论 #1392656 未加载
patio11将近 15 年前
I think my CS degree was very valuable (regular expressions! hash tables! discrete math! cache cache cache!), although I'd encourage absolutely everybody to pick up two degrees as long as you're there. You might as well get a jump start on domain knowledge.<p>Weaknesses of a CS degree:<p>1) At the point of graduating college, it is likely that your experience working with teams in a production-like environment will be minimal. I think I did, hmm, three labs like this? None of them produced anything close to a real software product.<p>2) Academics don't work like industry. I worked at the university for a bit after graduation and we still didn't use, e.g., source control, testing, etc etc. Pick your favorite best practices test, we would have scored negative. It took me a few years to learn better habits.<p>3) You tend to do a lot of stuff which has little relationship to what you'll be doing for the rest of your life. If I were dictator for life of the CS department, I'd have kids exposed to web programming very freaking early, because it is much more likely they'll end up doing that than fat Java client apps (what we <i>actually</i> did in school).<p>4) There are a lot of soft skills that go into engineering that some schools give short shrift to. I will defend this one to the death: the most important skill for an engineer is oral/written communication, and their ability to actually produce stuff is a distant second. We had <i>one class</i> on technical writing.
评论 #1391782 未加载
评论 #1391802 未加载
评论 #1392143 未加载
评论 #1395343 未加载
flatline将近 15 年前
One thing missing is a separate programming degree. The current CS curriculum at the schools I've seriously looked at has become a muddled bunch of courses that cover many basic CS topics at a very shallow level, trying to teach good programming practices along with some theory. This trend should be reversed in a CS degree - a lighter emphasis on actual programming and a heavier emphasis on mathematical analysis, proofs, etc. There is plenty of this kind of thing that has real-world applicability only tangential to programming. Even the grad-level AI courses at the University I'm attending downplay the role of math. There is nothing wrong with this per se, but I believe that it is at the expense of the real potential of teaching people CS at the undergraduate level. IS degrees sometimes fill the role of a "programming" degree but the variety there is pretty broad.
SamReidHughes将近 15 年前
When I left school my biggest gap was in my practical idea-to-code translation ability. I'm talking about the ability to sit down and write some useful code. I had spent the previous three years thinking about type systems, programming language design, and math, and when faced with the problem of having to make some code that would do some thing, I'd say, "What's the simplest angle from which to look at this problem?" It turns out that a much faster way for me to get well-designed working code was to just stop worrying and implement it badly, and not care about the design -- the best angle is from the inside. I've learned to artificially devalue good design.
barrydahlberg将近 15 年前
Personally I'm not that interested in the deep mathematical side of CS. To me the two biggest problems are a poor understanding of abstraction and a lack of style.<p>Abstraction is so much more than "Apple is a Fruit" style OOP. Objects, processes, ideas, language... a focus on abstraction from the start is one of the reasons I think the SICP videos are worth watching.<p>Programmers must learn to develop their own sense of style in their code. Practice writing things until they flow and feel natural. Coding is communication, to you, your team and your computer. Try not to stutter.<p>Keep in mind I studied in NZ and was generally a terrible academic, we are far away from anything like MIT...
gte910h将近 15 年前
I went to a school (Georgia Tech) where the CS degree is made up of a core and several specializations which actually let you have a huge swath of classes relevant to what you want to do. I had only 2 "math type" CS courses (within the college, I additionally had Combinatorics and "Calculus 3 for CS" which was basically matrix math methods, but they we taught by the actual math department).<p>I do think this approach where there are lots of specialties (Software Engineering, Game Prgramming, Systems Programming, etc) allows people to get experience and training relevant to where they're going in life.<p>All that said: I really really really want to see realistic mentored debugging go on in a CS program. I want to see 2 students and one experienced adult, sit down and learn next to someone the ins and out of all the modern debugging techniques (debuggers, binary search, profilers, memory leak detectors, etc). None of the classes had anything like that, and that was the biggest thing missing that comes to mind.<p>The second biggest thing is <i>realistic estimation methods</i>! Until I read a book on it and practiced a lot, I was horrible at it. Very little was taught on actual methods to make useful estimations.<p>(Here is a non-aff link to the book who's material I'd like to see covered in a college CS curriculum): <a href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351" rel="nofollow">http://www.amazon.com/Software-Estimation-Demystifying-Pract...</a>
StudyAnimal将近 15 年前
Industry might say that CS should concentrate on churning out experienced software engineers, but they are just avoiding the responsibility for training themselves.<p>If you read CACM academia thinks CS is missing students. They want to dumb it down to get more people in, especially less geeks and nerds, and more women and minorities. They are looking at ways of dumbing it down and making it appeal more to the masses.<p>I think in general CS is missing industry contribution. I would like to see more commercial enterprises writing papers, submitting at conferences, doing research, and training graduates to become developers.<p>Some CS programs seem to have buckled under pressure and turned into learn-java trade schools. These places are missing computer science. Some try to simulate the working environment and focus too much on working on larger projects in teams because that is what industry wants, but we have our whole life to do that and uni can't teach that well anyway, you need real experience for that.<p>But in general, I think most CS programs, especially after year one are pretty good, and teach what they should be teaching.<p>I like them to teach the classic core CS disciplines, theory, algorithms and data structures, AI, databases, software engineering, graphics, and they should focus more on leading edge stuff that is perhaps not so well used in industry but provides interesting scope for further research. I think they should deliberately use languages, paradigms, and tools that are not (yet) mainstream in industry.
cema将近 15 年前
I would say that an intrinsic weakness of CS (and, probably, any other engineering) education is that a lot of the curriculum is targeted towards a past goal. CS is not just science but also industry, arguably in some ways more industry than science, and a very quickly evolving one. Not all professors can keep the curriculum up-to-date.<p>Fortunately, it appears to be a relatively small drawback. Particular details may change in a few years anyway; being prepared for the change is more important, as is being capable of learning, and this normally comes with a solid foundation which a good university program can provide to a good student.<p>This is a very general answer. I apologize that I cannot give a more detailed answer; my exposure to the CS education was through a graduate school which gives a different perspective.
GeneralMaximus将近 15 年前
I've started realizing just now that your standard CS degree is completely useless in the real world. I feel like I've learned absolutely nothing in these two years. Fortunately, a combination of real life events and comments from people on HN has opened my eyes to what I <i>don't</i> know. So, here's what you - correction, <i>we</i> - need to do to complete our education:<p>1. Contribute to a FOSS project, or start and manage your own. Alternatively, build a product and try to monetize it. This pretty much covers everything that your CS degree claims to teach you. Now we can move on to more important things like ...<p>2. Learn to meet and talk to new people. Learn how to be comfortable around people, and to make other people comfortable around you.<p>3. Learn to speak in public. Learn to clearly present your views and opinions to an audience.<p>4. Meet women. You won't get time to do this once you're a Silicon Valley billionaire ;P<p>5. Learn how to negotiate. Learn how salespeople and negotiators employ simple psychological concepts to get people to agree with them. Learn how to protect yourself from these people.<p>6. Study non-CS subjects. Psychology, economics, music, art, whatever. It's critical that you broaden your horizons beyond standard CS topics.<p>This is what I've figured out so far. If more experienced people have anything to add to the list, please do :)
评论 #1392013 未加载
liedra将近 15 年前
I'm a technology ethicist (with a BSc in CS though!), so I have to jump in here and say that society-aware and ethical design principles are seriously missing. Things like how to involve the stakeholders (not just the client, but anyone who might be affected or who thinks they may be affected, or who are simply interested!) in your design process, how to decide whether your technology/program/etc. is actually <i>wanted</i> by society (e.g. the Genetically Modified Organisms issue in Europe, where despite the science being awesome, the public just <i>didn't want it</i> due to the behind-their-backs political wrangling that was going on). And last but not least, how to make sure that, before you start implementing your amazing idea, your idea is <i>acceptable</i> to society. Not accepted, since that's just a matter for compromise in the end, and compromise is not what ethics is about (it's about choice!).<p>Technology has a bad habit of arriving, and then the mess being sorted out later. It'd be great to get those creating it to realise the impact they will be making on society and do something about it before it creates the mess. Of course, regular feedback loops on how it's all going throughout the lifetime of the project are also necessary -- just look at the facebook debacle recently! And the Google wifi scandal! And I could list a whole bunch of other seriously problematic incidents in the last 10 years (which, incidentally, is around about when I had just started my CS degree).<p>I realise this is mostly a pipe dream, and that most CS students snore through any "ethics" classes they may have, but instead of these "why are we here?" classes, perhaps integrating ethical design principles into the general procedures for software engineering would be a start.
jsankey将近 15 年前
A large missing element is managing change - and how this relates to maintaining a successful project. I see this as one of the fundamental challenges of developing software in the real world. It's something you can largely ignore during a degree, where it is unlikely that a project lasts more than a few months. The best way to learn what challenges you'll face in the real world is to take on a long-term project. You'll make assumptions and mistakes early on which you can learn a lot from.<p>It would also be great to observe or join an existing project -- a project that has been around for some time but still maintains a strong momentum -- and learn from the way it works. That is, short cut some of the process by observing others that have overcome some of the challenges.<p>This should also teach you that there is so much still to learn about successful software projects that you'll be doing it your whole career :).
dbachrach将近 15 年前
One of the best things I've heard: Be wary of anything claiming to be the real-world that is not actually in the real-world. Teaching "real-world" computer programming in school is an impossible goal. You only get the real-world experience when you are out in it. CS should prepare you for the real world, and help expose you to the real-world, but it's almost impossible to teach it. What CS does teach you is the bigger things. The bigger concepts that go beyond software engineering, or any particular project in particular. You learn how to think about big things and hard problems. CS at a university is not a prep course for your job per se. It's not a trade school. You're learning things that can be applied in the real-world but transcend the real-world. It's important to realize that there are more important things than just being able to program C# for your job.
endtime将近 15 年前
I suspect a lot of CS departments don't encourage/teach teamwork. I majored in CS at Georgetown and never wrote code with a partner. Then I spent two years at Stanford doing a MSCS and did group work in very nearly every class...which was extremely valuable.<p>So, my advice: Learn to write code in a team.
评论 #1392718 未加载
robryan将近 15 年前
I think one thing which is probably overlooked a lot and could be considered outside of computer science is communication skills. No matter where you go with your degree: academia, industry, start up or further study these are skills which you will need.<p>It doesn't mean you have to give up a broad education on underlying computer science principles to get these either, just include things like presentations and written reports with the theory work as you go. Team work is a contentious one as well. if there is team work you have to mark each persons contribution to the team rather than the team as a whole. I have had the experience of being lumped with some pretty terrible people work ethic and skill wise and had to produce something as a team.
nhnifong将近 15 年前
I just finished my CS degree, and I think that it was worth it. I had time for self-directed projects in any language I wanted, learned about web programming, interface design, compiler and interpreter design, regression testing, prototyping, and all kinds of things that I might not have learned on my own. The only glaring problem was that the professors never had time to teach. They treated classes as an annoying distraction from research and programming, and many of them simply did not focus enough energy on teaching, and were unprepared for class.
malcolmwhy将近 15 年前
I graduated last may as a computer science major and realized the holes in my skills were everywhere. I found that my theory was much better than my actual ability to code. It seems that schools should teach their students one oop language for three years and then start showing them what other options are out there. I found myself in the working world convinced I knew how to code in java, c++, python and php, w/o the real skills to work in any of them.
评论 #1392059 未加载
shin_lao将近 15 年前
Everything of importance cannot be taught.<p>Degrees will always be "inadequate" compared to the fast changing world. What is important is that it gives you tools to apprehend your work and even perhaps your life.<p>In your case, computer science (mathematics) and fundamental languages are a must (Lisp, C, assembly...).<p>Get the basics right. You'll have all the time in the world to learn "business stuff".
eam将近 15 年前
Hmmm... I think "up-to-date" professors. I've had professors who've been teaching for decades and they're still stuck in the decade they started teaching. In some instances it's ok, but in other instances it's just obsolete and new methods to approach a certain problem have been developed since then, which they are unaware of.
评论 #1391953 未加载
arihant将近 15 年前
Women. It hurts.
评论 #1391778 未加载
评论 #1391784 未加载
iamwil将近 15 年前
How to build things.<p>Stuff you learn there is valuable. But you won't know how to build things unless you--well, try building things.
barmstrong将近 15 年前
USER INTERFACE DESIGN<p>Most cs students graduate without experience making products that normal (non cs) people can use. That's a shame, especially when you consider that some killer products (iPod, Basecamp) have largely been successful due to user interfaces.
评论 #1392213 未加载
starkfist将近 15 年前
Some CS programs are very good, it often depends on the school. Generally speaking, math has been de-emphasized too much and statistics is almost non existent.
branden将近 15 年前
History of Computation. Read some old papers, study the people who wrote them. I would've loved a class like that.
jrockway将近 15 年前
Math, science, and programming.
lleger将近 15 年前
The real world.
评论 #1391988 未加载
kurumo将近 15 年前
Generally speaking, CS programs out there seem to lack both depth and breadth, be out of touch/time with "the desert of the real", and suffer from what Dijkstra called "the infantilization of curriculum". Too often do I see people who are proficient (for some value of "proficiency") in one (1) language, usually the wrong one. I believe that a CS program ought to introduce you to several languages, to a level where you can read and write programs of small to medium size (~1 kloc). At a minimum, in this day and age I would expect C, your least favorite mainstream language (though I personally would avoid Java, due to combination of a lack of an explicit reference type and a misguided OO fetish), something from the Lisp family (Scheme), and Javascript. Something from the ML family would be a bonus, though I would skip type theory altogether. Having been exposed to several radically different languages helps. I would ask everyone to write an interpreter for a simple language (in a language of your choice): something with variables, conditionals and function calls. A compiler for the same would be a nice next step. As projects go, this would be sufficiently involved to address Dijkstra's complaint part of the way.<p>A few people said something to the effect "the real world is missing". It's true. Majority of CS programs appear to be years out of date with respect to the industry practice, whatever "the industry" happens to mean for you personally. To some extent this is inevitable, though we could be doing a lot more to address the issue - say, as someone suggested, via a separate course, one that is updated biannually. A course like this could and should include a discussion of things like source control tools, build tools, etc. Things like resource management idioms in languages of the day should be discussed explicitly: too often graduates of CS programs assume infinite resources or automagical cleanup, especially if they come from a background in languages that are garbage collected. A course in parallel programming presented via different languages and their approaches to parallelism would be fantastically useful; I would pay money to see it on OCW or similar.<p>Somewhat related to Dijkstra's complaint is the following concern: people are terribly bad at thinking about complexity, at all levels - from a single source file to a system composed of hundreds of separate processes. We would do well to discuss managing complexity explicitly in CS curriculum: to make people think about difficulty of maintenance, changes to a working system, rollout procedures for uptime, etc. A seminar on the subject of complexity management, from small to large scale, with examples, would be very useful.<p>Incidentally, this is something I have been thinking a lot about over the last two years, in part due to conducting a metric shitload of interviews for intro positions. There are things that my CS program was missing, and things that a majority of programs out there seem to be missing; understandably, what I can say mostly applies to the former.
tehdik将近 15 年前
CSS, Javascript, XHTML, PHP.