I’m graduating with a CS degree but I don’t feel like I know how to program.
stackoverflow.com
stackoverflow.com
Your question shows that you're probably one step ahead of your classmates.
You will always be learning and always be working hard (hopefully). It doesn't really get that much easier, but it does become a lot more fun and rewarding.
You'll be fine. Thanks for the post.
Being weak in algorithms means that the author wouldn't be able to get in the door at amazon (which loves its juniors), but IMO that's a good thing, because I'd never want to work with someone who learned how to develop "production" software at amazon. (It was some of the worst code I'd ever seen -- and I went to amazon after over six years of government contractor work.)
Good documentation and comments always seem like a hassle... until the first time you have to go fix a bug on something you wrote 18 months ago and have no clue how it works.
But they topped it off with extra special levels of stupidity: The vast majority of amazon's software ends up being written by juniors, and when they finally bring in seniors, they put the juniors on new systems and stuck the seniors with the task of adding features to the crap (because seniors are "good at wading into bad code").
I think production code in any realtime environment, whether it be at Amazon or a trading desk at a bank, tends to converge towards crap just because of the time pressure on the developers.
I read a bank security audit report once... it made me very concerned about banking in general. It was astonishing how many glaring security blunders these banks were making -- and this was pervasive, neither isolated nor limited to small banks...
So if I was in the OP's shoes (and I almost was, although I wasn't a bad programmer when I left school, just green), yes, learn to program and work on projects on your own. But also learn some stuff that your coworkers aren't likely to know. For me, it was just enough Bayesian stats and applications thereof to have insights that others wouldn't. For someone else, it might be distributed systems, or computer vision, or physical simulations, or information design, or algorithmic game theory, or fancy math, or any corner of the CS or math or statistics literature that has a pratical application but which most programmers don't know. I found that even good programmers won't generally know how to take the KL divergence between two distributions, or write the EM algorithm or put take the MAP estimate of a binomial rate parameter given a beta prior, but there are a lot of software applications for that kind of knowledge. And the world is full of cool problems waiting to be solved by someone who knows how to program, but also knows something else.
1) You've learned (or should have learned) how to learn new things. Don't stop once the dean hands you your degree.
2) There are probably a lot of people out there who are a lot smarter than you, and that's also okay. Use that knowledge to grow from your working relationships with others and learn more from them too.
Focus less on the individual technologies and more on the other skills learned via extended education.
Caveat: Lots of people don't need to pursue higher education to learn these things, it was just a necessary personal experience for me.
(edit) There's a post on SO by user RussellDias which puts this far more eloquently and fully than I could have.
I came from the opposite end of the spectrum: started building "websites" with PHP and have grown to be a full fledged programmer in PHP, Python, Erlang, Scheme, and Objective-C. I quickly learned that my creations were sub-par and poorly engineered because of gaps in my knowledge of abstract concepts.
Learning about the Theory of Computation sky rocketed my skills, shoring up my mathematics education has also greatly augmented my understanding of why certain things work and why certain things are a bad idea to do (even though you have the rope to do it!).
Knowledge truly is power, the rest of it you will gain through experience. The OP will quickly learn that he will be above those that did not get through a CS degree because he does understand the minutia of the system and he will be able to understand the engineering process with precision. Rather than "stabbing in the dark" as I see a lot of my peers doing - who did not even bother to at least teach themselves the basics of computational theory, mathematics, &c...
You're on the right track my friend, as many have already said - just start getting some experience. The best route there, IMHO, is by contributing to Open Source Software; nothing taught me more about software engineering than slowly becoming a core developer for an OSS project!
Are there any resources you can recommend in terms of "Theory of Computation"?
Greatly appreciated.
No offense to this guy but the reality is, if you are not into this stuff before you started college (aka writing your own programs because a) it's cool, and b) you got tired of not having a program that did what you need, etc), then it's a pretty brutal career path.
Think about it this way, most good/great programmers are just coders because it's how they've always been. If you are just getting into this industry because it's a good career path then you have to realize you are going against guys like me who started programming the Atari 800 when I was a kid because, well it was fun and just seemed right.
I wish him luck, but this isn't 1998 any more and companies aren't going to just hire you off the street just because you have a CS degree. The competition level for jobs right now is higher than it's been for a long time. With that said, he can certainly make this work, he just needs to start coding on his own to learn and grow.
There's a possibility she's just in the wrong field altogether. Most of the computer science people in my classes knew at least one language fairly well coming in as freshmen. I can't say they were all great programmers, but they did know how to program.
Maybe, if she was a straight A student without much practical experience, or a B student with a lot of practical experience, I would think differently. But she isn't.
That said, there are tons and tons of mediocre - bad programmers that make a career out of it. I'm sure she could as well. I just think maybe there's something out there that she would be really, really good at. Why stick with something that you aren't so good at?
Thus, the OP could say that he doesn't know how to program because he's actually pretty good at programming.
Starting early doesn't mean you're any good. 4 years of a serious, programming intensive CS degree is better training than 20 years of farting around with PHP.
We don't apply this criteria to other endeavors. I've been playing piano since I was 5 and I'm still not good at it. You're either good or your're not. Sometimes experience helps, sometimes it is a hindrance. Bad habits form early, too.
It's also curious that programmers claim that programming since they were a kid makes them a better programmer, but they also complain whenever a job advertisement requires years of experience.
That's really funny and true.
Yeah, agreed, I know plenty of CS degree holders that are top notch coders as well. But I have to say, I don't think a single one of them hadn't learned a language or two prior to college and I doubt they ever thought for a second 'I'm not sure how to program'.
I agree that C can be terrifying and confusing at first. The buggy GCC of the late 1980's/early 90's was not friendly for beginners. One of the class project's bugs disappeared for no reason when we changed the order of function definitions in one file.
It gets easier once you a) learn assembly language and b) write a compiler. Fart around with some CoreWars and Google "NAND to Tetris."
Every from that point has been easier, in most ways.
I was lucky, everyone of my friends had a C64, and they were swapping games. We couldn't afford a C64 at AU$399 at the time, so they got me the VZ300 for $99. I had to write my own games. This is how I got into development.
I was one of the few that could program, before I went to Uni. It was around the time that CS was becoming very popular, but hadn't start to differentiate between different sorts of IT, so they offered everything. The classes I found best were hardware, OS, and the half year class were we had to write the same program in 4 different languages.
I still remember how good it felt when my brother started loading up the games that I wrote rather than the few 'commercial' games that we had for the system.
PS: VZ300??? I thought I knew everything about the Australian 8-bit computer scene, but I managed to miss that one.
Great little machine for $100. Funny thing, the VZ200 had a chiklet keyboard, which are becomming popular again. One of the big selling points of the VZ300 was that it had a proper keyboard.
http://www.old-computers.com/museum/computer.asp?st=1&c=...
To do Assembly language programming I had to get the 16KB upgrade kit, which was this huge piece of hardware that stuck in the back.
Now that everyone has had a computer and serious internet since about age 8 it would actually be pretty weird if they hadn't tried programming at all before college.
My comment wasn't great because I also didn't mean that having a CS degree makes you good. What makes you good is practice on hard problems, and a certain amount of "je ne sais quoi."
Agreed - in fact I'd say out of the best programmers I've worked with almost all had CS degree's.
"Starting early doesn't mean you're any good. 4 years of a serious, programming intensive CS degree is better training than 20 years of farting around with PHP."
Never implied 'programming for 20 years' made you better than a person that has a CS degree. I actually meant that all the good programmers I know - CS degree's or otherwise - started before college and did it because they loved it. Same guys that go home and read regular expression books for 'fun' in their spare time.
"We don't apply this criteria to other endeavors. I've been playing piano since I was 5 and I'm still not good at it. You're either good or your're not. Sometimes experience helps, sometimes it is a hindrance. Bad habits form early, too."
True, but again I never said that simply programming for 20 years made you a great coder. I simply meant that someone with this trait, who then pursues a career as a programmer (through a CS degree, or whatever) is going to have a leg up on someone who isn't really into it.
"It's also curious that programmers claim that programming since they were a kid makes them a better programmer, but they also complain whenever a job advertisement requires years of experience."
Not sure what you are talking about here. When I've had to hire a junior it seems like a lot of people with the wrong skills apply for the position, but experience-wise, if you have been programming for 20+ years that's not the issue for me. It's if you have the skills the job I'm looking to fill needs.
It goes to show that there's no correlation between programming skill and degree. Most of the worst programmers I've ever worked with had CS degrees, because they tended to write the most pointlessly complicated code they could. They were invariably the most guilty of premature optimization, and rarely produced code that worked any better than my minimal implementations did -- and of course, no one could ever prove that their implementations actually worked, because they were incomprehensible.
Get a challenging job where people can criticize your work and not a job where you can code and deliver with no feedback (except from users with no programming background).
In software, just because it works, it doesn't mean it is well done.
Also, if you can't note a significant improvement in your skills over the next three years after graduation, you're not going to make it big in this industry.
But, you know what? That doesn't mean that I'm any worse off in terms of ability (to code, design, learn or understand concepts) than you. And I'm not sorry for not spending my teen years implementing Ukkonen's algorithm or whatever else would count for you. I can read the paper on how it works if I ever need to implement it.
I object to claim that in order to code, you have to have some sort of monkish training. That if you're "like this," then programming is the only path or that you have to be "like this," in order to be a programmer. Your point of view seems like a horribly elitist, closed-minded view to have.
5 years ago I used to think I had the coding thing down pretty pat -- now I'm much better than I was then, and I have a lower opinion of my knowledge as well :)
I'm not nearly as arrogant as to think that I know everything in my particular domain(s) of interest. I can look at whatever language(s) I consider myself proficient in and name half a dozen things in half as many seconds that I know nothing about.
I simply disagree with the "You have to have coded for years before going to college for coding to be a good coder" line of thought. You have to have the time, yes. But, imho, it doesn't have to come from college and it doesn't matter when you start.
FWIW, I'll be done with undergrad work at college at 21 (assuming I graduate on time next year). Could have finished by this summer (ie: before I turned 21), but, I do enough classwork during the semester, I wanted my summers "off" (read; working/internships instead of classes).
FWIW, I don't recommend this, but (and I've faced this with my own kids now) there's really not much choice. I was already bored in school; if I'd been back another year, it would've been even worse.
But yes, there really should be some drive towards interest in your career path. If not, you'll struggle to improve, and would likely be significantly happier doing a different job.
I often encounter the assumption that all "good" programmers start early in life and/or that all "good" programmers have an innate drive to build things and that's why they got into programming in the first place. (I think the two assumptions are related). And while it's true that many good programmers meet those two criteria (probably the majority), they're not universally true.
There are other reasons to love programming besides just the end result; I myself was drawn to it because I'm fascinated by the intellectual challenge of taming and organizing complexity, and of the way program construction can be seen as a series of rapidly-evaluated scientific hypotheses (i.e. "I think I can do X this way" and a short while later, relative to pretty much any other discipline. you have confirmation or rejection of that hypothesis).
I did, however, leave school with a bit of a complex precisely because I don't fit the traditional grew-up-tinkering-with-computers mold for software engineers. I thought that all those other people must be better than me, or be lightyears ahead of my skillset, or that because I came to the profession differently I must be somehow inferior or have a lower ceiling on my abilities. It took me a couple of years of programming professionally to realize that wasn't the case and to be confident in my abilities.
Anyone with the right set of cognitive skills can do fine in a college CS program regardless of their background, and anyone who has the skills to make it through a college CS program and who enjoys what they're doing will do fine as a professional programmer if they're willing to keep learning, regardless of their prior background. (And I don't mean to imply a CS program is by any means the only way to go, merely that someone with no prior background who goes through such a program will likely be fine.)
If you want to be a great software developer, then you should (1) major in CS and (2) learn how to program. These are usually two separate but mutually beneficial things.
On the one hand, hardcore theoretical courses at the average CS school don't exist as weed-out at all. If you're lucky, you've got a good faculty member teaching a compilers or operating systems course that'll make it challenging, but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog, Complexity Theory and C are "impractical" for someone doing a CS degree, because, you know, everyone uses "OO" (whatever that means) nowadays so that's the theory we should teach. Plus, if we teach a hard course about the theory of computation, lots of kids will flunk, and we can't have that, now can we?
On the other hand, any attempt to make the curriculum practical (since most schools border on vocational training anyway) is met with the response of "Well, a CS degree shouldn't prepare you to be an industry programmer!"
So really, most universities are left in a luke-warm middle-ground, where theory is being neglected but no one is willing to be the administrator who "flips the switch" and turns CS students into non-stop code monkeys.
Really, grounding yourself in a lot of CS theory, while occasionally forcing yourself to break out and hack up a project, is probably the best route to becoming a well-rounded programmer. Whether most people are capable of realizing how bad current CS education is and doing so, however, is another matter.
Agreed for most schools but I will say that there are good schools that still teach at that level. The Intro to Programming Languages class at Northwestern has you implement an interpreter for a variety of different languages, including a variant of Scheme called Typed PLAI. Haskell was used as an example sometimes and we implemented a number of similar features (basic type checking, currying, etc.). I know that the operating system and compilers courses here are very difficult and have heard similar things about the corresponding classes at CMU.
Very nice!
The required intro classes are also pretty rigorous, although I didn't take them personally. I'd bet that any CMU CS (note that engineering is a very separate program at CMU) grad would at least somewhat know how to program, and will have programmed in assembly and ML, along with the usual Java and C. Obviously you have to check whether they got C's in the big rigorous classes or not, but it's basically a good bar. It would be impossible to graduate and then fail FizzBuzz, for example, which to my understanding is not true of most CS programs.
The one main complaint I had with it was that the required freshman theory course (251), which is supposed to be this great legendary weed-out thing, was just a hodgepodge of badly specified discrete math, and still is, to my knowledge. It was hard, but in my opinion not in a good way. Maybe it works as a weed-out but not as an educational tool. The later required algorithms course, 451, was much better.
Consequentially, I have had a job lined up for several months.
All that to say schools that teach both do exists.
I'm not sure what you're trying to rebuke here. Did I say they didn't?
Completing it the worse way possible, ie setting up arrays and traversing them linearly would give you an execution time in the hours. It really took experimenting with different versions of most of the structures and algorithms taught to get the best execution result.
This years assignment that my brother is doing, seems that to get the fastest execution given the stuff taught in the class it's just a matter of using one hash table and a couple of numerically indexed lookup arrays. So the people doing it this year will get nowhere near as much out the assignment.
MOST college degrees are essentially useless. There are hundreds of jobs out there that don't require programming or a specific college degree. There is no reason to let your degree pigeon-hole you into a career path.
If you're asking for my advice, I honestly don't feel like you're going to cut it as a programmer. Sorry kid. A true hacker is going to run circles around you and you'll most likely not be able to compete if you aren't competitive after college.
With that being said, LIFE IS NOT OVER. Find a job that you like. Most people respect those that are able to complete a computer science degree and will hire you into a huge array of jobs (financial analysts, consulting, i-banking, technical sales, etc.)
It was always assumed that any student could learn the language of their choice from an off-the-shelf book. I myself knew about half a dozen languages and mastered a couple before I graduated, but that was all extra-curricular work. In many ways I'd probably be a better developer if I obtained a Software Engineering degree instead, but CS gave me the foundation to tackle the interesting computational problems.
The professors knew they would be much more valuable explaining how RSA worked than how to debug a syntax error or learn the language of the month.
Most CS profs don't teach programming because they don't have anything interesting to say and would rather teach something else. They are not programmers.
I feel this is slightly hyperbolic. CS often isn't a productless field, even in academia. While many fields in CS can get away with simply publishing algorithms and other codeless papers there are many subsections where implementation is a vital part of the project. For example, the Xen project was originally an open source academic project.
I think the biggest problem in academia is the tight schedule. Unfortunately, many of the problems you encounter in industry take too long to be properly implemented in the structure of a semester course. For example, long-term maintenance and technical documentation are at the core of any significant software project but by the time most of that stuff would come up the semester is already over.
http://www.indiangeek.net/wp-content/uploads/Programmer%20co...
Instead, you write a program that let's people enter in what they are doing. You then take what they wrote, and store it someplace. You then write something that display what people stored. Etc.
The thing is, most 'social media platforms' are essentially just a lot of CRUD.
In most software jobs, practical experience outweighs theoretical knowledge. I would guess that the people from 2 year degrees spend a lot of their time actually programming, whereas those with the 4 year CS spend a lot of their time learning about computer science.
At MIT and there is really only one software design class you need to take for a CS degree. It is expected that to learn to program you need to do it by hacking around on your own or working at software companies during the summer.
I've found that there is a significant group of CS majors at MIT (myself included) that are more interested in the cool things that can come out of theory (and eventually programming those things) than in programming itself.
I would be bored out of my mind gluing libraries together to write a chat program, for example. While I find the process of designing/building/tinkering with anything exciting and fun, I am simply not that interested in chat programs. I'm not even that interested in computers! To me, the freedom to explore my interests related to computing and computer science, without being pigeonholed into a "standard" computer science curriculum is fantastic.
Hence, I've spent more of my time learning about interesting topics in computer science and math than I've actually spent coding. And I've spent even less time designing software (as opposed to just coding on various simulations/algorithms/mini-projects).
To echo what someone else said, yes, genuine hackers my age will probably code circles around me when it comes to programming. But we're probably not even interested in the same kinds of jobs.
I am not saying software engineering is not important -- it's simply taking me longer to become competent at it (or at least "employable") because I'm trying to combine it with other interests.
Almost everything I learned about writing code came outside of class, mostly messing around with open-source tools and games.
In fact I'd guess that the OP knows how to program, but she's not yet a good designer and is aware of it.