Slashdot Mirror


What Knowledge Gaps Do Self-Taught Programmers Generally Have?

BeardedChimp writes "I, like many others here, have learned to program by myself. Starting at a young age and learning through fiddling I have taught myself C++, Java, python, PHP, etc., but what I want to know is what I haven't learned that is important when taught in a traditional computer science curriculum. I have a degree in physics, so I'm not averse to math. What books, websites, or resources would you recommend to fill in the gaps?"

36 of 396 comments (clear)

  1. Self-taught too. by G2GAlone · · Score: 4, Informative

    Being self taught myself, I think the biggest downside is some of the strategies and standards that are taught in the mainstream curriculum (IE: how to properly use the object-oriented model, etc.). Especially when I first started out, my code may get the job done, but it wasn't the cleanest or best approach. Luckily, I think it will come to you in time if you focus on improving your code.

  2. testing and architecting by Anonymous Coward · · Score: 2, Informative

    testing and architecting (building frameworks) etc.

    read your gamma and fowler...

    1. Re:testing and architecting by sohp · · Score: 2, Insightful

      Testing and thinking like a QA person -- there are great resources out there for how to write tests that really have a chance to find and exercise bugs, it requires a knowing a bit about the most common programming errors.

      Anything not specifically related to churning out "working code:
      * proper use of source control
      * how to debug effectively and debugging without leaning on the debugger as a crutch, e.g. the "binary search" strategy
      * choosing the right tools for performance analysis and improvement
      * how to read and understand existing code and where to make the changes you need to make
      * how to prepare for and conduct a code review
      * writing a technical memo or as-built document for a program or key part of a program.

  3. Design patterns by metageek · · Score: 2, Insightful

    design patterns

    --
    metageek
    1. Re:Design patterns by wbren · · Score: 5, Interesting

      Self-taught programmers might not know design patterns by name, but they will likely stumble upon the more common ones on their own. When they finally learn about design patterns, they will understand the topic better because they "invented" some of the design patterns themselves. That's how it was for me at least. One day I was explaining something to another programmer, and after my long explanation he just looked at me and said "Oh, so you're using the visitor pattern." I tilted my head, went online, and learned a new name for something I had been using for years.

      --
      -William Brendel
    2. Re:Design patterns by tgd · · Score: 3, Insightful

      Some people might consider that a good thing ...

    3. Re:Design patterns by es330td · · Score: 2, Insightful

      This has been my experience as well. Though I don't have a CS degree, I had enough formal programming work as an Engineering major to understand how to do it mostly right. When I was lead Internet developer for a computer sales company I ran into a large number of developers who excelled at finding things online that could do part of their overall goal and then massaging the outputs to be able to string them together. Yes, the solutions worked but looking at the code reminded me of a car built by collecting parts from every manufacturer and forcing them to work together with a bunch of adapter kits.

      The worst problem with these solutions is that they are virtually unchangeable. The code from each has been so massaged to feed output to the next piece that all flexibility to extend or change is lost. Asking the "developer" to change his solution is effectively asking for a complete rewrite.

  4. Algorithms by dionyziz · · Score: 5, Insightful

    Although in practice most of the time advanced data structures and algorithms are not used, it is useful to study them and implement them yourself at least once. Dijkstra's algorithm, Prim's, Kruskal's, maximum flow, and other basic graph-operating algorithms are a good example.

    1. Re:Algorithms by ryanvm · · Score: 3, Informative

      Seconded. As a self taught programmer, classic algorithms are always my weakest link when I do an interview. Unfortunately, it's also the most glaring, since they usually teach that kind of stuff early on in COMP SCI. I had an interview with Amazon a while back and in preparation bought the book "Programming Interviews Exposed". It's a pretty good resource for getting your hands dirty with all the algorithms that a general programmer should know.

    2. Re:Algorithms by sonamchauhan · · Score: 2, Funny

      "interview with Amazon a while back and in preparation bought the book "Programming Interviews Exposed"

      I hope you didn't buy it off Amazon ;0)

  5. Working with others.. by QuantumRiff · · Score: 2, Insightful

    No, I'm not being a smart ass.

    Others have slightly different styles and conventions, and ways of solving problems. Working on something like a large open source project could teach you about working on a team, where one person can't "own" a whole part of a program. (And cleaning up others code will greatly help you learn about documenting and formatting your own code.) One good team assignment we got, Each person work on a part of a program. Away from computers, we had to, on a whiteboard or whatever, decide inputs and outputs, etc between parts, then code separately. Grade on that assignment was how well the program behaved when the teacher, in front of the class, compiled the separate parts, and ran it for the first time combined.

    --

    What are we going to do tonight Brain?
  6. DP, Algorithms, OOP A&D, Threading, etc by LordKazan · · Score: 5, Informative

    Design Patterns: common "Template" solutions to regularly encountered problems/variations-on-that problem. Be careful when learning these that you don't fall victim to "when you have a hammer, everything is a nail". Also learn the Anti-patterns, wikipedia has a good list of anti-patterns.

    Algorithms & Data Structures: Analysis, average running time Big O is most important, but understanding worst-case runtime is important too. Designing algorithms vs knowing when to leverage an existing one.

    the C++ standard library provides a great many of these, it has a high efficiency sort (from ), it has good collection data structures (vectors, linked lists, maps, etc)

    Objected Oriented Analysis And Design: Knowing when to make something an object, when and how to use inheritance and polymorphism, when to not make something an object. Plain old data objects. separation of responsibility: UI is not logic, logic is not UI.

    Threading: proper thread synchronization techniques (mutexs, semaphores, conditions, etc), threading patterns such as Producer-Consumer, Inter-process communication

    Automata & Computability: (Deterministic|Nondeterministic) Finite State Machines, Regular Languages, Turing Machines

    Programming Languages: LL language parsing & rules authoring.

    Computer Architecture: Processor design, pipelining, caching, function calling conventions, etc - how to use this knowledge to write more efficient programs

    --
    If you cannot keep politics out of your moderation remove yourself from the Mod Lottery.. NOW!
    1. Re:DP, Algorithms, OOP A&D, Threading, etc by CodingHero · · Score: 3, Insightful

      To be fair, I got BS degrees in Computer and Software Engineering, but if we consider only the required courses from both these curriculums, I gained:
      - NO education on design patterns
      - A very limited understanding of how to apply big O analysis to an algorithm (although I do understand what it represents)
      - Almost NO attention to "proper" OO analysis and design. Any knowledge of this I have is from personal experience during school and professionally
      - only a cursory look at threading.
      - A good understanding of state machines
      - Exposure to language construction (via a required course on compilers)
      - A good understanding of computer architecture

      What one learns in an academic environment is very much dependent on the core curriculum the school has and thus a self-taught programmer may not be at much of a disadvantage at all.

    2. Re:DP, Algorithms, OOP A&D, Threading, etc by bullok · · Score: 2, Interesting

      This is an excellent list. I was self-taught from the age of about 12, and thought I was an excellent programmer until I was about 25. Having earned BS and MS degrees in Astronomy and Mathematics, I'd written a fair number of programs, and had a decent command of about 7 languages. Then I went to graduate school for Computer Science. And I found out that my knowledge was SEVERELY lacking, both in breadth and in depth. How much of my missing knowledge was relevant to day-to-day programming tasks? Well, perhaps not surprisingly, not much. However, when I come across some issue where my CS education is useful, it's HUGELY useful, and enables me to tackle a problem in far less time, and most importantly, implement a correct solution. It also lets me know when I need to turn over a portion of a project to a specialist. In other words, I'm now more aware of the things that will become a time sink, and increase uncertainty if I attempt them. This ability to do "project triage" is one of the benefits of a well-rounded CS education.

      I think that this is the main reason that you'll hear a lot of people say that a university CS education isn't very useful. For about 98% of the things you work on, it really doesn't make you any better than someone who's self-taught. But that remaining 2%... it can mean the difference between blowing months of time on a crappy solution to a problem, or knowing how to put a good one together in a few days time. So, on the whole, a Uni education can make you a far better programmer, even though you won't necessarily find yourself pulling tricks out of your Uni bag every day.

      As an example I'll add my 2 cents about only one of the topics mentioned above: Programming Languages. There are many cases where programmers try to develop a "simple" scripting language for embedding in an application. This is one thing that very few people (even uni-educated) should attempt. Proper language design and parsing is VERY difficult, and there are at least a half-dozen well-designed scripting languages that can be literally dropped in to an application with almost no effort when compared to the complexity of rolling your own. And yet, we see time and time again, people attempting to write one from scratch. One of the worst examples I can think of off the top of my head is LSL (Linden Scripting Language), used in Second Life. It's an absolute nightmare of a language. And yet, it made it into a large-scale product like Second Life.

      There ARE many cases where a domain-specific language (DSL) can be incredibly useful, especially when the language does not need to be a general-purpose one. In my experience, it's rare for a programmer (no matter how their skills were gained), to create a good DSL without a strong grasp of at least a dozen programming languages or so. University-educated programmers tend to be a better judge of whether they are up to the task of designing and/or implementing a language(at least, after they've tried their hand at it once or twice).

    3. Re:DP, Algorithms, OOP A&D, Threading, etc by CodeBuster · · Score: 2, Insightful

      I have BS in Information and Computer Science and I must say that my experience was remarkably similar to the parent's. One problem, IMHO, is that the major is called "computer science" when it should really be called "computational science" instead. People assume that the degree is all about computers and their use but this is a misnomer. It is more correct to say that "computer science" is a specialized study of mathematics as it relates to computation and its complexity with some practical high level computer engineering concepts thrown into the bargain; computers are merely the tools that we use to investigate the theories in practice. Almost everything that I actually use in my day to day software engineering jobs was learned after graduation through working. IMHO, It would do a better service, both to students and industry, if universities would break up the curriculum so that software engineering, "computer science", and computer engineering were more clearly distinct majors. There would be commonalities of course, particularly in the lower division courses, but right now too many students go into "computer science" without really understanding what they are getting themselves into before they have almost enough courses to minor.

    4. Re:DP, Algorithms, OOP A&D, Threading, etc by metaforest · · Score: 2, Insightful

      I cut my teeth on Z-80(Sinclair Zx-80/81) and 6502 when I was 11. I am only now working towards my first BS and your earlier comments about the %2 gap (more like 10% for me) are quite salient. Though at my age I am not going to go for CS. I am going for business admin and project management, as I think this is an area I can best apply my experience with new training.

      I don't disagree with the conclusion on LSL: That is LSL is fail. I do think that the intern who designed and implemented LSL did an admirable job considering LL had no idea what users would do with SL. They also needed to keep the execution environment for scripts light-weight, and memory constrained. It does quite well in that regard. I regularly see 4-8K scripts running in a Sim, with only a few % lag over an empty sim. On the other hand, I have seen what happens when some asshat figures out how to get a few hundred scripts to make a sim useless, without attacking the physics engine. Giving the general public execution privileges on a service like SL is not an easy problem to solve. In that context maybe LSL isn't all that bad for what it DOES do.

      The issues with manipulating Non-Phys prims are actually related to the way the Havok physics engine handles them, not LSL. Those issues would exist no matter what language were driving the property inputs.

      It does need to be replaced. Rebuilding the language on the MONO VM was the first major step in eventually supporting a broad range of languages; possibly even allowing 3rd party compilers.

      ----

      Funny you should mention Lua... I am currently in the process of modifying Lua to run on PIC32MX series micro-controllers. The intent is to provide a development environment for these amazing controllers that is easier for an enterprising 11 year-old to get their head around than embedded C or raw assembly.

  7. Some suggestions by nicc777 · · Score: 5, Insightful
    I was learning and coding on my own steam for about 15+ years. Then I joined the ACM (two years now) and my eyes opened. I am now about 1/3 though a B.Sc in CS (part time) and I'm also following a CPD program at another University. I have also joined the IEEE as I required access to more material for my studies. What I realized was that I should have done it from the start. So my advice is simply this: start to follow some part time programs and get the theory as well. I have learned in the last two odd years a lot on subjects like modelling, quality assurance, frameworks and architectures which I otherwise would not have known. I also found that the quality of my code has greatly improved since I now work in a much more structured way.

    Experience helps, but the real killer deal is experience backed by a CS/Eng. degree.

    --
    Need an ISP in South Africa?
  8. Algorithms, data structures, systems by ColonelPanic · · Score: 2, Informative

    If you know your algorithms and data structures, and have a firm grasp of the architecture of modern computer systems, you'll be way ahead of a depressingly large proportion of people with degrees in CS that come past me in interviews.

    The most informative and entertaining book I can recommend on algorithms is Bentley's "Programming Pearls".

    --
    "Skill shows through where genius wears thin." -Wittgenstein || Religion: uniting aviation and architecture.
    1. Re:Algorithms, data structures, systems by LordKazan · · Score: 2, Interesting

      As a recent CS grad (dec 2008, but that was "school 2 years", "break work in field 2 years", "school 2 years") I can attest to the lack of skill of some of the people who only retain information for the duration of the class they're in. What was even more disturbing was in my graduating class (only 8 of us) the two of us with the most experience: academic, open source, professional full time work in the field were the LAST to get jobs.

      --
      If you cannot keep politics out of your moderation remove yourself from the Mod Lottery.. NOW!
  9. I'm Interested in the Opposite View by moore.dustin · · Score: 2, Interesting

    What gaps do schooled programmers have that self-taught programmers don't? While a self-taught programmer might go about getting the job done differently, I can almost always count on him to get it done. Programmers coming out of school often still have a horrible worth ethic, especially when compared to their self taught peers. Granted, I have a very limited experience, so I wouldn't cast that judgment over all, but I would be curious to here what others think.

    1. Re:I'm Interested in the Opposite View by RationalRoot · · Score: 2, Insightful

      1) in the real world 40% is not a pass

      2) why don't many school even mention source code control?

      3) error handling is not an exercise left to the reader, it needs to be structured, organised, and it really helps if you know what you are trying to achieve with the error handling.

      --
      http://davesboat.blogspot.com/
    2. Re:I'm Interested in the Opposite View by david.emery · · Score: 2, Interesting

      That's a good question, too.

      I'd suggest
            a. Debugging techniques (but then I strongly prefer design/language approaches that minimize debugging in the first place)
            b. Programming-in-the-large, including (i) program structure; (ii) maintenance/documentation considerations (That's true for programmers who have worked on large, well-run projects.)
            c. MAYBE multiple programming languages - As I wrote in another posting on this thread, I will not hire a mono-lingual programmer. Too often people coming out of schools have been exposed to one programming language, the popular language-du-jour. If you've been around long enough you've probably worked in several different languages and seen how each language points you towards a certain set of solutions.
          d. Understanding of the non-coding aspects, such as design documentation, etc. Again that's true for people who have worked in well-run shops. The rate of illiteracy among programmers isn't getting any better, and in any project > 5 people you'll spend as much time doing reading, writing, talking, etc, as you will in front of a computer typing in code.

    3. Re:I'm Interested in the Opposite View by SoftwareArtist · · Score: 2, Insightful

      My experience is that the best predictor of programming ability (among professional programmers) is whether someone learned to program before college. The best programmers are the people who were introduced to programming when they were 10 and fell in love with it, not the people who got to college, decided CS seemed like a good career path, and so took an intro programming class. If you love doing something, you'll learn to do it well, and if you just see it as a job, you likely won't. In fact, the biggest problem with many CS majors is that they think they know how to program well, not realizing that computer science and software engineering are actually very different subjects.

      That said, self taught programmers definitely have holes they need to fill. Lots of other people have said this already but I'll add yet another vote for it: algorithms and data structures. Get a good book on them. Learn them. This is bread and butter stuff that a professional programmer really needs to understand, and if you haven't studied it, you probably don't realize just how much you don't know.

      --
      "I'm too busy to research this and form an educated opinion, but I do have time to tell everyone my uninformed opinion."
  10. Proper code analysis by smbell · · Score: 2, Informative

    I have a CS degree from a major university. I have to disagree with most of the comments I've seen so far. Things like design patterns, proper object modeling, even advanced data structures and algorithms can be picked up on your own with a bit of effort as you need them, and experience building real production used software is the key to hone those skills.

    IMHO there are two things that I got from school. How to properly analyze code (in terms of processing time, memory usage, ...) so that I could accurately predict how it would behave under different conditions (especially when some of those conditions can't easily be tested). And an introduction to a large swath of computer science terms and facets, so that years later something comes up and I have a faint understanding of where to start looking.

    The code quality, design, and ability to apply [insert new hot term of the day] correctly all come from real world experience. And I do think you have to get that experience in a professional setting (I would consider much of the open source world profession, just FYI), hobbyist work just won't let you grow the way you need to.

  11. If you don't know where you've been... by fmayhar · · Score: 2, Informative

    I've been doing this for a few years and the one gap I'm seeing more and more of doesn't actually have anything to do with programming techniques, "design patterns" or anything else that's hugely technical. All of these things are pretty well-known and accepted by everyone, and you can always be sure that there'll be someone around pushing one or another of them as the be-all and end-all of Programming.

    The one gap you might have as a self-taught programmer is in fact in the _history_ of computer science. There's a lot of stuff that has happened and in fact people keep finding and solving the same problems, never realizing that the problems have been encountered and solved many times. (An example that's particularly relevant to me at the moment has to do with extent-based file systems; ext4 has extents and so do a number of new file systems. Great idea, right, particularly for large file systems? Thing is, extent-based file systems have been used at least since the 70s in mainframe operating systems. Odd that it took 40 years to get it into Unix.)

    But don't feel bad that your self-teaching has skipped the history of computing. It appears that most university computer science programs neglect that little bit of background as well, in favor of jumping straight into C++ or Java.

    Maybe I'm an old fart but that half-semester of history I took back in 1981 made a small but significant improvement in my ability as a software engineer.

  12. Design and Adaptability by Temujin_12 · · Score: 3, Insightful

    I've found that self-taught programmers can actually be quite productive. However I've noticed (in general) the following deficiencies which I think are both rooted in the fact that the need to memorize seemingly arbitrary facts about a system is inversely proportional to deepness of understanding of that system (see graph):

    -Design Patterns (noted earlier by others): There is a tendency of self-taught programmers to follow a design pattern more doggedly than others. This can be tied back to the fact that for the self-taught a particular design pattern represents what programming is to them. They memorize a series of facts that support the design pattern they use rather than understand the nature of a design pattern itself. They tend to have steeper learning curves when presented with new structures and design patterns because using a new design pattern requires the abandonment of the facts they've memorized and starting anew with memorizing a new set of facts.

    -Adaptability: Self-taught programmers tend to reach a certain level of comfortableness with technology (ie: languages/libraries/etc.) and attach themselves to it. The thought of using a different language, library, or system is daunting (or even aggressively resisted) since, again, changing requires a new memorization of facts around the technologies (see graph).

    Much of what you should learn formally from a CS degree is WHAT a programming language is or WHAT a design pattern is, not merely HOW to program or HOW to use a particular design pattern.

    That said, there's nothing stopping a self-taught individual from learning these things on their own. It's just that when you're teaching yourself a trade you, naturally, immediately (and sometimes exclusively) focus on things that allow you to compete on a particular level or with a particular technology. Learning design patterns or what programming is in the abstract doesn't seem to have an immediate payoff (clients aren't going to ask you about those things). But they are skills which allow you to be competitive across technologies or design patterns which is especially important in the rapidly changing world of computers.

    --
    Faith is a willingness to accept something w/o complete proof and to act on it. Reason allows you to correct that faith.
  13. Self-Taught by LCValentine · · Score: 2, Interesting

    As a self-taught PHP and C# Developer, the biggest trouble has already been outlined as limited exposure to new concepts. The bigger question, however, is how to gain exposure.

    #1 - User Groups I personally don't attend user groups because I have 2 jobs, and 2 kids, however, the Ruby community has shown again and again that it works, not just for the new stuff, but for the old stuff. They just overhauled Rails and as long as the community keeps talking, they'll do it again and again to perfection.

    #2 - Contracting It's a large assumption, but if you have the time to learn a language, you've got time to find small contracts, and hopefully ones that will introduce you to knew people with difference foci (focuses?). Also, digging unto other people's code helps you think outside of the structures that you taught yourself - you might even get some extra cash. Check out craigs list, elance, etc

    #3 - Open Source Not as good for your wallet up front, but if you think you have a unique perspective that is applicable to an existing project, donate some code. Bug fixes are just as valuable as new features.

    #4 - Publications I use this in the loosest sense of the word possible. I "camp" PHP.net because there are new functions popping up all the time. Their search database is fairly decent, so when you're thinking like a PHP dev, put a word or two in and see what pops up. MSDN isn't too bad either, but the naming conventions vary, and it's so large that simply search for keywords is a challenge (They have an "OrderedDictionary, but not a UniqueList...?)

    #5 - Inspiration (& Perspiration) Nothing develops with out the the will power and simply getting things done. Going back to #3, you can simply start your own project or feature. Lots of things are pluggable these days, and if your desired functionality doesn't exist, don't cry about it - build it! PHP doesn't have events, because events don't make a lot of sense on the Web.... HOWEVER, if you're writing a PHP-JS-AJAX framework, then they make a LOT of sense. Noone says you HAVE to release your code either... managing a repo is a lot of work. The point is to build something, find the pain points, then ask yourself "Is there a better way to do this?" Find the better way, build it, and make your life easier... then share it if you can.

  14. Maintenance programming by geek2k5 · · Score: 2, Insightful

    I'd say that formally taught programmers may not have much experience with maintenance programming, especially with legacy systems that have been running for years. They are used to 'blank sheet' programming assignments that allow them to control the entire project from start to finish. They don't have to deal with code that has been modified dozens of times over the years, often without much documentation.

    I got my professional start in programming doing maintenance programming under the supervision of a senior programmer who had spent years working with the systems as they evolved. While I had done some programming in college, all 'blank sheet' stuff, doing maintenance programming was much more educational. You had to make sure that things were done right, otherwise you could cause big, real world problems.

  15. Functional Programming and Complexity Theory by Lemming+Mark · · Score: 2, Interesting

    You almost certainly already have some grasp of Complexity Theory since it governs why e.g. mergesort is faster than bubblesort. I personally found it a somewhat dull topic but it is probably worth delving into a bit for "self improvement" purposes.

    Functional programming is worth playing around with. US universities tend to focus on Lisp, I think. ML and Haskell are often used in the UK and have a very interesting type system (proponents say that it's about the most advanced one out there) that it's also worth being aware of. Haskell is also a lazy language, which is interesting although you're unlikely to encounter it anywhere else! Some of my ML programming course dealt with how to build lazy data structures without explicit language support, which was potentially a useful technique.

    Others have mentioned design patterns. I guess it's worth looking at those since even though you might instinctively know some, it's easier in an interview if you can *name* them so they know you know what you're talking about.

  16. Re:O(n^2) by frosty_tsm · · Score: 4, Insightful

    I'd say you need to learn enough mathematics to get an appreciation for what goes into the discovery of an O(nlog[n]) algorithm -vs- its [naive] O(n^2) counterpart.

    This is a gap I've seen with self-taught programmers: they didn't take algorithms classes where you analyze algorithms for efficiency and write complicated algorithms for (mostly) academic problems. Even amongst university-taught programmers, most people see this class as a waste of time. I've taken it twice (undergrad and graduate level) and find it helps me in my job.

  17. Gotta disagree. by mosel-saar-ruwer · · Score: 3, Insightful

    You could teach people all they need to know about big O and common algorithms in an afternoon.

    Sorry, but I gotta call B.S. on that one.

    You need YEARS of mathematical training to grok this stuff.

    Have you ever tried teaching college level programming to recent American high school graduates?

    I have had young adults [some already with bachelor's degrees who were coming back to school to brush up] who couldn't reliably compute anything in Base-16 [hexadecimal].

    They need the better part of a decade's worth of intensive mathematics training to get to the point that they could really grok the difference between what goes into a "slow" O(n^2) algorithm and its "fast" O(nlog[n]) counterpart.

    And let's face it, lots of people doing basic HTML or VBA [Visual Basic for Applications] probably don't have sufficiently high IQs to make that transition.

    And even if they do have sufficiently high IQs, then summoning the self-discipline [not to mention just the spare time] to tackle this stuff is going to require a really formidable application of the will.

    Which is not to say that it can't be done, but the odds are definitely stacked against them.

    1. Re:Gotta disagree. by mopower70 · · Score: 2, Insightful

      Wow. With teachers like you out there, I'm surprised anyone ever learns anything. You denigrate an entire generation of students as well as programmers of 2 languages, then justify it by boasting that it took you YEARS to learn something most of us picked up in a semester or two?

      I'm not saying someone couldn't learn from someone like you, but the odds are definitely stacked against them.

    2. Re:Gotta disagree. by Korin43 · · Score: 3, Insightful

      Intensive math training = Knowing that n^2 grows faster than n * log(n)? You don't even need to understand math for that (Wolfram Alpha or a calculator will tell you). Figuring out if a program/function completes in O(n), O(n^2) or O(c^n) time is something that anyone with a basic understanding of loops and jr high math could do. O(log(n)) or O(nlog(n)) are slightly harder, but that's only because most people don't deal with logs in everyday life.

      And one more thing.. what's the big deal about teaching people hexadecimal? What's the purpose? I can do it, but I've never once thought of a reason I'd want to. Isn't the whole point of the compiler that it does that stuff for you?

    3. Re:Gotta disagree. by joshki · · Score: 2, Informative

      Computer Science is math. Many people confuse computer science and programming -- the two are not the same.

      A programmer is not necessarily a good Computer Scientist.

      A Computer Scientist should always be a good programmer -- it's one of the core skills in CS.

      Doing research and writing compilers is not the only thing CS people do.

      Knowing and understanding Assembly language can greatly improve the code you generate. That knowledge can be critical to optimizing the algorithms you use in your code, whether you actually code anything in assembly or not.

      --
      I do not read or respond to AC's. If you want a discussion, log in. Otherwise, don't waste your time.
  18. Re:O(n^2) by element-o.p. · · Score: 2, Informative

    That kind of thing isn't necessary in most programming. Niche knowledge ftw.

    I disagree. Maybe you don't need to understand FFT's in your line of work (I don't), but analyzing algorithms for efficiency is absolutely a real-world skill.

    If you don't at least understand these concepts (, then you don't understand why one algorithm is crap in the real world and another algorithm is preferred. If you don't understand why one algorithm is crap and another algorithm is good -- even though both provide the correct results -- then you have no business writing code professionally. This is not just an academic exercise. I have seen programmers (and I'm using the term very, very loosely here) who could not get the concept that nesting for loops -- while conceptually simple -- was an exceptionally poor way to do what they were trying to do. Then they couldn't understand why all our user were complaining that "the network" or "the server" was slow, when in fact, the network and the server were fine; it was the developer's piss-poor code that made a snappy network and bleeding edge hardware appear to be so sluggish.

    --
    MCSE? No, sir...I don't do Windows. Yes, I am an idealist. What's your point?
  19. Re:No, Learn C++ by SanityInAnarchy · · Score: 2, Interesting

    I wanted a multiparadigm language to help me learn different approaches to coding.

    And for that, you chose C++? Really?

    Not Ruby, not Python, not even Javascript? C++?

    learn C++ at an adequate level and then most other computer languages should be easy to comprehend.

    Except Lisp. And purely-functional languages, like Haskell. And interesting things like Erlang -- immutable, non-shared memory plus message-passing. And...

    Learn one language well, and other languages will be easier to pick up, yes. But calling C++ "multiparadigm" is like calling Java "Object-Oriented". It makes you sound smart, and it even makes sense when you know a little about the subject. Then you learn what the term actually means, and you see a language which actually does that successfully -- Ruby is object-oriented in a way Java can only dream of.

    --
    Don't thank God, thank a doctor!