Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
What is the best way for a non-CS major to obtain credibility as a programmer? (stackoverflow.com)
26 points by ecounysis on Nov 6, 2010 | hide | past | favorite | 35 comments


Ship code. Most developers get that CS isn't programming. Programming is much more of a vocational skill, w/o the negative connotations that go along with it. It's really a lot more dependent on what's hot right now and a lot less concerned about first principles.

Your average computer scientist doesn't really care about refactoring, or design patterns, or dependency management (unless you happen to research that field -- and notice that everything I listed is in the software engineering subdiscipline -- pretty much every other subdiscipline in CS is completley uninterested in the programming flavors of the month).

For most professional dev shops knowing a particular technology well (patterns and such included) is more important than being well versed on most aspects of computer science (whether theory, algorithms, ai, programming languages, architecture, compilers, discrete math, etc...).

So learn something well enough that you can ship/deploy/launch a good product based on it, and do it.


yep I see real world programming as mostly a superset of so-called CS. Or say they are two overlapping circles, and the circle representing programming is much bigger than CS, and includes a lot of non-sexy and soft squishie stuff like dealing with users, dealing with managers, clients, your own personality and learning styles, work flow, best practices, tools, etc.


Turns out, it's the same as the best way for a CS major to obtain credibility as a programmer. All you have to do is major in CS to know how much variability in talent there is among CS majors.


The best way would probably be to expose your work by contributing to open-source projects. You can either start your own project if you have an idea of something that could be useful to others, or join an existing project.


Program. Anything.


Better: contribute to something open source so people can (a) see your work and (b) see that you can work with someone else's codebase, which is harder than just dealing with your own.


The best programmers I know have EE degrees. Just saying...


Indeed. Perhaps a better question would be, how can a fresh CS grad convince a team of experienced software engineers he's not hopelessly theoretical...


I keep running into Music majors that are very good programmer.


The very best programmers I've known personally have, mostly, had no college degrees, or, a degree in something other than CS or EE. But EE does seem to attract a higher average intellectual caliber than CS programs do, so that may explain what you've experienced. I know a lot of kids enter CS undergrad programs with the hope of making "easy money" as a Blub Developer later on, with many of them finding they hate it and dropping out before the end. You don't see that anywhere as much with EE.

Also, I think there's this weird effect with degrees where if you're bad or mediocre but you have say a CS degree, you're more likely to stay working in the field than if you had no CS degree or no degree at all. Because if you suck, and you have no degree, there will be so little demand for you you'll have trouble staying continually employed. But by having a degree, especially in CS, you gain an edge and can get past more hiring and big corp HR-ocratic hurdles than you otherwise could.

This last bit is just a theory, I could be wrong about it as a contributing force. But I'm confident in the first part of what I said, where I've seen a disproportionate of the best without CS degrees, or without any at all.

Lastly, I know many guys who started programming as a kid and a common issue for them is you'd get to 18 and have to pick a undergraduate program, but much of CS, especially early stuff looked lame and child's play, whereas many other fields were equally or more interesting and the chance of getting to play with those other toys, and interact with those other professors, was way more attractive.


I would guess(not all of them necessary of course):

- Build something good enough to be proud to put it online

- Maintain a technical blog

- Get a job in a small software company and use this as a step and a credibility-maker, after that you will be part of the CS-certified folks by official experience

- Do not think much about not majoring in CS

Good luck


Write good code. Let people (whose opinion will confer credibility) see it.


Attention to detail. Do the little things well and be consistent. Just remember, talk is cheap, build stuff.

Also, keep learning. There's always more to learn.

This coming from a guy who was a Physics major, took a few beginning CS classes in college, and then just jumped in. If you want to be good, you'll get there.


You can do the modern "hey I can do this!" by getting a program you wrote onto an app store (confirmation provided by good ratings and sales).


i could really write quite a bit about this. i'll try not to and instead attempt to be concise.

i wasn't a cs major before either. 2 years ago i set aside a quite successful consulting business i'd started to go back to school as a 30-something self-taught industry programmer and "fill in the gaps" so to speak.

let me say that a good cs education makes a night and day difference to being self taught. even if you're rather good. sure there are very good self taught programmers and while, of course, i'm self-deprecating and don't consider myself one, i've known quite a few. and sure there are also a lot of hacks in university CS programs, even the good ones though relatively fewer the better the program. i'm surrounded by lots of people who i stupidly judged as "beneath me" at first, because of all my so called industry experience, but 90% of them continually surprise me with their ability to solve very complex problems under very non-negotiable deadlines.

i thought i knew something when i went back to school. indeed, this actually caused me quite many problems at first because i tended to rely more on what i knew than what was being taught. but i reached a point rather quickly where my industry experience wasn't going to help me at all, and in fact actually hindered me because there was much i'd learned incorrectly.

but that's why i went back to school. so i threw much of what i'd accumulated over the years out the window.

i was previously a math major, but even doing the required CS discrete math, number theory, combinatorics, probability, set theory, formal logic, etc. introduced me to ways of thinking about math i had not previously seen. i think this is where a bit of rigor in the program one selects helps. some cs curricula will just gloss over these details, but at a huge disadvantage to the students because a really good understanding of a worthwhile algorithms book (cormen, leiserson, rivest, stein, for example) requires them. there's a big difference between doing something (i.e. writing code) and doing something well (writing purposeful code that is an elegant expression of some theoretical model).

a solid basis in algorithms is an immensely useful thing. even if it all just seems like "theory" at the time.

why? because i can understand most research papers or published documents i read now without having to look things up. or when i have to look something up because i don't know the answer, i generally know the right direction to look in. or i can look at someone else's code and see that they have actually chosen the wrong data structure for accomplishing a task, leading to a vastly inefficient algorithm. or, more importantly, framing the problem in the right graph-theoretical model and, as a result, exposing a richness in the data that i'd not known to exist previously. my first taste of this was the famous four-color theorem. from there i was hooked.

...and that was just the first year of being in school. it's also worth pointing out that year i really started to realize the importance of being able to rigorously prove the correctness of each step of an algorithm. though a lot of proofs are those by construction where one essentially describes building the model as the proof, some loop invariants or algorithms must be proven inductively for one to have any certainty about them. indeed, i now believe this was a critical skill to develop. proving the correctness of things improves one's ability to think clearly.

interestingly, in my free time i often consider how my education has affected my old development patterns. it might seem that with all this extra formalism that i now sit down and plan everything out before writing even one line of code, harkening back to the old rational-rose way of doing things. to put this to the test i've done a couple side projects in the last couple years and found that my development style was about the same as it was previously: start with an idea, address the nagging issues with implementing it, build a quick (but refactorable) prototype, test the hell out of it, and revise it until it all works. the thing is that in those interim steps i'm drastically more competent now than i was before. when i get stuck on something i can often get unstuck quickly by reasoning my way effectively out of being lost in the forest, and with the tools i have (and paradigms i have access to) if i absolutely must write my own solution from scratch, it's generally written well. and if it's not, it's usually because i didn't understand the problem i was trying to solve ... not the particular coding technique i was trying to solve it with.

so other activities (non-chronologically) were things like writing operating system components, replacing parts of the java collections framework with probabilistic data structures or building our own red/black trees, designing chips, writing an embedded system or microkernel, creating oCaml/scheme/haskell parsers and REPL's, building C++ as stroustrup first did (by doing lots of plumbing with void pointers in c), designing new DSL's, spending hours on theory of computation proofs and decidability, implementing the viterbi algorithm for a speech recognition system and other wondrous dynamic programming problems, binary and stereo vision, distributed/parallel computing, and the list goes on...

it has all built on the foundations we laid in the first few courses. had i skipped those parts, my solutions would have been less elegant and less correct, if i'd even been able to understand the problems well enough to solve them. and it also has the unanticipated side-effect of my having an intimate understanding of the beauty of the chain of ideas that has led us to this point in technology.

of course i'm hoping that all this work results in less loathsome cruft. i look at code i'd written from 5 years ago and shudder. some of it was quite clever but, on the whole, also quite naive.

ok, so i wasn't as brief as i'd intended to be. the main point is: you can have a great career as a self-taught programmer. i did previously. if you really love cs material, why not study it formally? if you have the opportunity to go back to school and do it, even if you're older or even if you have to do it part time, it will be extremely rewarding. and if it advances your personal "state of the art" and contributes to your passion, chances are it won't be a waste of time.

of course there is an opportunity cost...the money you won't be making when you're in school and the nagging thought that "what if you were on the path to building the next tech revolution and you veered far in another direction to go back to school". i'm afraid my opinion is totally useless here. for going back to school was life-changing to me in many ways beyond cs knowledge. there is much virtue in living a simple existence continually engaged in the pursuit of knowledge. maybe it's just my personality, but i'd say "veer away".

...

edit: i'd just like to add that i'm not trying to insult self-taught programmers here by any means. at the end of the day, i wholly believe that it all comes down to deliverables.

i mainly wrote this to communicate my own experiences when i asked myself a question similar to the original topic of the thread.


I am a senior right now graduating from a program that is somewhere in between MIS and Computer Science. I didn't really know what I wanted to do when I came to school so I chose my major almost purely based on the fact that I "liked computers and stuff". I discovered that I had a strong interest in programming during my Junior year from working an internship as a PHP developer. From there I have worked in another PHP role for a startup and I have done a few projects with Ruby on Rails. I have also had lot of Java experience from my classes and I am currently taking classes on threaded concurrent programming.

I have learned a lot about managing software projects, testing, design, and development methodologies but I feel like I am really missing the fundamental knowledge that I need to be a great developer and really understand the nuts and bolts of my profession. I am at a crosswords right now because I have not been able to find a job post graduation yet. I have a strong interest in doing startups at some point on my life, however I want to have money to support myself because I am going have bills and I am broke. I also don't know if I have enough skill to really be successful programming a high tech application or freelancing, at least for a few years. I guess my decision right now is between getting any job to make money in the IT field to support myself or working a part time job to pay bills and going back to school somewhere and trying to get CS degree. I really think that I want to understand how computers work and pursue knowledge but at the same time I am getting kind of burnt out with school and I want to make money.

I would love to hear any opinions you have on this because it seems like you went through a similar process.


will respond to this in the next day or so. trying to get a massive project done :D


I was just wondering if you had a chance to think about this. I am really interested in hearing what you have to say.


Thanks a lot, I appreciate it!


By the way...it's worth mentioning that I've been quite miserable in school about 50% of the time. The workload has been really insane and for many assignments autograders are used, which are absolutely merciless if your output deviates even the slightest bit from the solution's, which we never had access to. That and it felt like very little of my experience outside school was pretty much useless.

If you decide to go and feel like the assignments are boring and tedious, just stick through it. there are a lot of much needed courses to prepare you for the second two years. Once you get there, the first two years will make sense.


Thanks a lot for the reply it is definitely pretty inspirational. My problem right now is that none of my math credits would transfer to CS so it would take about 3 years to complete a new BS in CS. I am just not sure if I could do that financially right now. I think I am going to look into going part time while I am working or maybe doing online classes.


can you get financial aid/scholarships? why won't your math transfer? you can try to "test through" some of the math by taking placement tests. could be a disadvantage for you later though, probably not in your CS program because it's more discrete math/probability/combinatorics heavy, but BS/CS usually has to take the physics sequence, which requires it.

on second thought, you also want to get very good at linear algebra. can you knock out the math at a local community college?


i'd say if you can go to school for software engineering, go for it. apply to all the schools you want to go to (and some safety schools), pour your soul into the admissions process and SATs and choose a B.S. in CS at the best school you get into.

when i faced the decision to go back to school, there were a few forces at work:

1) the money i could have made elsewhere: i lived the life of a startup and came out the other side of it not rich but with plenty of financial security. this kind of comfort can not be understated. if you seriously think in a year or two you can save at least $50-$100k by working, then do it. know that if you go this route it will affect your financial aid (if you are eligible for it).

2) the value of a degree (vs just getting by on talent): many years ago i was a math major at a top 10 world university. i got drafted by a startup during the dotcom boom and decided to take the 6-figure salary and put my education on hold. for 10 years i never thought twice about this. that was until i got bored in my field and thought about making a change. the thing is that 10 years before as a math major i could get any computer science job with the proper amount of experience. but looking around now, that just isn't true. to really be eligible for [nearly] anything, one needs at least a BS in computer science. search around on job sites if you want to verify this. smaller companies are willing to take you for the experience you have, but larger companies aren't.

3) school is a fun and worthwhile thing. a good CS program will teach you true software engineering. no matter how interested and motivated i was to do book learning on my own, nothing has even come close to the formal training i've had as a CS major. All of those hard exams and impossible assignments where i stayed up for 3 days and nobody was willing to lend a helping hand. well, i solved those problems, got decent grades, and now my knowledge is solid. this in itself is a reward. so much so that when i finish my master's i'm considering going for a doctorate. it's that rewarding.

4) lastly, of all the things in this world, nobody can ever take a good degree away from you. you can lose your house, your car, your wife, your dog, your favorite whatever, but that college degree sticks around. as does the knowledge you worked hard for and the strength gained from challenges you overcame. you will become a better and more interesting person as a result. this is not to say that people who don't finish don't persevere and have rewarding lives...my school experience has actually been quite miserable and i miss the life i had before. but for all the punishment i've endured, i can truly say i've come out ahead.

there are plenty of people who have dropped out of college and succeeded wildly. gates, zuckerburg, biz stone, ev williams, jobs, ... and the list goes on. but when you're younger 4 years is such a small amount of time to spend on something. and when you're 24 and have a nice degree, you won't think twice about it .

look into financial aid/scholarships/grant money. i've managed to get my entire education paid for taking full time classes and getting good grades. it's amounted to roughly $29k (tax free) a year. plenty to get by on for a few years.

best of luck!


so other activities (non-chronologically) were things like writing operating system components, replacing parts of the java collections framework with probabilistic data structures or building our own red/black trees, designing chips, writing an embedded system or microkernel, creating oCaml/scheme/haskell parsers and REPL's, building C++ as stroustrup first did (by doing lots of plumbing with void pointers in c), designing new DSL's, spending hours on theory of computation proofs and decidability, implementing the viterbi algorithm for a speech recognition system and other wondrous dynamic programming problems, binary and stereo vision, distributed/parallel computing, and the list goes on...

All that can be found in good books and without a blabbering blowhard in front of a blackboard.


yes, this is true. after all, we use books.

that said, there is much value in having a structured set of challenging assignments with strict deadlines (presumably with some end goal) created by an engaging and knowledgable professor serving as one's guide.

finding the books is relatively easy: dig through the course materials of a respected school. i used to have quite a few of them on my bookshelf.

getting the most out of them, on the other hand, meaning both plumbing the depths of their granularity as well as casting that knowledge back into the framework of a coherent discipline, is something i'd argue is better done in school.


> created by an engaging and knowledgable professor serving as one's guide.

Very often, an impersonable and overworked grad student from a foreign country with poor English pronunciation, making it harder to understand what they're saying. But sure, in an ideal world, your CS teacher is the equivalent of a Feynman or Sagan, sure. That would be awesome, agreed. ;)


All that can be found in good books and without a blabbering blowhard in front of a blackboard

Yes, if you already know what books to read, which algorithms to study, even what the correct vocabulary is so you can look things up and speak to other programmers unambiguously.

You can't escape Rumsfeld's Theory, especially if you've never heard of Rumsfeld's Theory.


TL;DR :)

actually I read the first few paragraphs. I wanted to contribute though by saying that my impression is that the bulk of what they teach in a college CS program is stuff that's present in books. Indeed, they use books. Well, those books are also available to any old random guy on the street, regardless of whether you involve a college or not. And if you take advantage of those books (and when I say books I mean text and diagrams, even in digital or online form, etc., that part doesn't matter so much) directly, you have the benefit of saving a hell of a lot of money and time, and gaining way more freedom to learn at your own pace, where and when you have time. You can skip over things you already knew, and spend more time on the parts you need to. Much more so than at a university. It's not completely superior, of course, because there are some positives to college CS programs. But whenever I hear someone talk about how college CS education is great because you learn about data structures and algorithms and "fundamentals" I think, well, you can learn about those things without involving college either, and therefore the elements are confused.


Read the best books. OP already referenced SICP and TAOCP, so it sounds like he's on the right track.


Nobody reads the TAOCP, at least cover to cover.


Certainly not, but the fact that the OP is aware of it means he's on the right track.

Of course, someone asking this particular question will find TAOCP way the hell over his head, as I can attest.

But the fact that he shows a tendency even at this early stage to dig down to the fundamental underlying knowledge of the field, instead of simply being satisfied with Visual Blub.NET, shows he's on the right track.

I'd wager he'll eventually read and reread most of what are considered the best books in the field, and become an above-average developer at worst.


If I have the choice between reading TAOCP cover-to-cover or building a software-based startup which I can later sell for millions of dollars, I know which I'd choose. And have chosen. And I'm confident you can do the latter without doing the former.


make something.

preferably something you can send people a url for or something you open source on github.


1) Github 2) Ship code 3) Blog about code


I think the question suggests the obvious and rather simple and effective answer: by programming. Make software. Get it out there. Learn more. Get better. Repeat.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: