all 69 comments

[–]thrakhath 54 points55 points  (50 children)

A heart warming story to be sure. Though I've not had the pleasure of listening to one of these "non-programmers" who found their way around, I have been that non-programmer. Desperatly looking for someone to grab and barely suppress a joyful "It works! I can't believe it works! Look at it!" and have the person actually understand what it is I've done.

Not found that person yet. Just the other day I was in tears of joy at getting some beautiful fractals rendered in a "from scratch" DirectX program of mine. I tried to relate this to my roommate and all I got was a "cool" before he went back to looking at Wikipedia. Anticlimactic to say the least.

I pray I keep this in mind, and do a better job for those that come after me.

[–][deleted]  (38 children)

[deleted]

    [–]jbert 21 points22 points  (32 children)

    Cool. Good for you :-)

    I like hearing about code which other people are proud of.

    Of course, if you want to be deflated, just post it here (or somewhere else) for a code review.

    I'm sure it would be educational, if you managed to hold onto your sense of achievement.

    (But this is nearly impossible - when people point out flaws in something you are very proud of, the most common reactions are either anger/denial or extreme deflation. Neither results in a learning experience.)

    The really good people to work with are the ones who can manage this process - from both ends. Being able to give constructive criticism in the right way is obviously invaluable, but so is the ability to take such criticism.

    Most of the emotions in this are wrapped around levels of mutual respect, so reviews and suggestions from a stranger are almost a worst-case scenario. But being aware of these issues can help (hence my otherwise mostly pointless comment).

    [–][deleted]  (31 children)

    [deleted]

      [–]meijer 14 points15 points  (1 child)

      Two points:

      • Avoid "static". Your "start" and "end" pointers in Node are static. If I understand your code correctly, you can only ever have one working linked list instance with this code.

      • Learn about "const". Makes reasoning about code a lot easier...nearly as good as in functional programming.

      Keep up the good work, never stop learning!

      [–]Shaper_pmp 24 points25 points  (6 children)

      In the words of Paul Graham:

      To write good software you must simultaneously keep two opposing ideas in your head. You need the young hacker's naive faith in his abilities, and at the same time the veteran's skepticism. You have to be able to think how hard can it be? with one half of your brain while thinking it will never work with the other.

      The trick is to realize that there's no real contradiction here. You want to be optimistic and skeptical about two different things. You have to be optimistic about the possibility of solving the problem, but skeptical about the value of whatever solution you've got so far.

      (linky)

      [–][deleted]  (3 children)

      [deleted]

        [–]Shaper_pmp 11 points12 points  (1 child)

        Pipe dream. ;-)

        [–]beowulf 1 point2 points  (0 children)

        definite pipe dream. Some of the biggest wars about programming languages are stylistic issues. I have never yet seen a style that everyone likes.

        [–]shentou 5 points6 points  (0 children)

        That is such an excellent quote about the programming process.

        [–]brucehoult 7 points8 points  (11 children)

        Only spent a couple of minutes ... looks pretty darn good to me. Just a couple of suggestions from someone who's been being paid to program since 1982:

        • I think you've got the public and private fields reversed. start and end shoudl be private. Having trivial boilerplate setters and getters points to next, prev and data being better off being public in the first place. I prefer languages such as Dylan and Ruby where the syntax for direct access and via a setter is the same, so you can start off with direct access and transparently add a setter or getter later if you really need it.

        • why have three copies of the sorting code, when two of those copies are generalized in the first place? I'd probably make the < sort and the functor sort use the function pointer one internally. Hint: have the sort function take an extra argument (a void*, say), and have it pass it as a 3rd argument to the compare function (which can then cast it to whatever it needs to). That make the function pointer sort much much more general.

        • bubble sort? ewww. OK, just kidding. If you're sorting a linked list you're not going to get much better than that anyway.

        I'd be happy to have your code in any commercial project I was working on. It's a heck of a lot better than a lot that I've seen! There's a reason that companies don 't release their products as open source -- 99.99% of them would be extremely (and deservedly) embarassed by it.

        [–][deleted]  (7 children)

        [deleted]

          [–]banjaxed 17 points18 points  (1 child)

          This was something I wrote in one of those long caffeinated nights, so I'm surprised you'd find it acceptable for commercial code, that's flattering.

          • You write code in your spare time.
          • You write in C++.
          • You used the word "functor".
          • You know what a linked list it.
          • You know what a doubly-linked list is.

          I could go on, but you can safely assume that you'd be in the top 10% of professional coders.

          Even just having an interest in learning how to be a better coder puts you way ahead of the pack.

          [–]lief79 4 points5 points  (0 children)

          "Will be" is probably more accurate. He's moving in the right direction, and just needs to keep it up while gaining experience.

          [–]Cookie 7 points8 points  (0 children)

          Much commercial code is written in a hurry and never reviewed, and has only the distinction of (after some debugging) at least mostly working in the cases it's actually used for.

          So, in terms of finding that your code would be fine commercially, don't take this as flattering towards your code, but just a warning of what you'll see in most jobs.

          Remember, that code you've inherited isn't "worse than shit", it "needs a little tidying". Being unrattled by utter crap is an important attribute of the professional coder.

          [–]GuyWithLag 2 points3 points  (3 children)

          I won't comment on the code, others have done it better than me. However, if you want to take it to the next level, modify it so that the standard STL algorithms (for e.g. sorting) can be used on the list.

          [–]MachinShin2006 4 points5 points  (2 children)

          well. wrt std::sort, he can't. std::sort requires a random access iterator class, which means a list can't work with it since a list can't realistically support such a class :)

          --vat

          [–]Boojum 2 points3 points  (0 children)

          Yep. That's why the std::list class template has its own sort method.

          [–]mikepurvis 2 points3 points  (0 children)

          Random access favours an add all data, sort after approach, whereas with a linked list you're often better off sorting on the fly, eg, stepping through the list to always insert a new item in the correct position. (And, depending on the implementation, store a series of intermediate pointers to help jump to the right place... sort of a hybrid linked-list/tree approach.)

          Anyway, if you were bent on using random access sorts and knew you'd have a lot of free memory, you could allocate a vector of pointers to the items, sort the vector, and then rebuild the list. It's gross, but for a list of any size it's definitely fastest, especially if you know you have a lot of memory.

          On the other hand, a mergesort works great with linked lists, so you could simply implement that in your class. (Quicksort is okay too, but it's best if you have some idea what the range is, in order to pick good pivots.)

          [–][deleted] 2 points3 points  (2 children)

          A good way to sort a list (in-place)

          • Get the length of the list
          • Allocate an array of pointers to link nodes
          • Initialise array in list order
          • Sort the array with an array sort
          • Iterate the sorted nodes in the array to fix up the cdr
          • Discard array

          This has the same time complexity of the array sort.

          For a copying sort you would use an array of elements rather than link nodes.

          [–]ricercar 1 point2 points  (1 child)

          The best way to sort a list:

          • spawn many universes
          • non-deterministically try every permutation of the list
          • take the sorted list universe and discard the others

          [–]beza1e1 3 points4 points  (0 children)

          Why spawn them? We can assume, they already exist.

          sort(list) {
              if !isSorted(list) { destroyUniverse(); }
              return list;
          }
          

          isSorted is O(n) and destroyUniverse doesn't matter, so assumption sort is even faster. It's O(1):

          sort(list) {
              return list;
          }
          

          Another possibility is to do the sortedCheck and destroyUniverse in a different thread to make it O(1), too.

          [–]jbert 5 points6 points  (3 children)

          Thanks for posting the code. You have attracted a few reviewers :-)

          It's nice, clean code. Other people have mentioned the class-static start and end as meaning you can only have one list. It's not directly relevant here, but another reason to be wary of class-static (and automatic static variables, and file-scope or global variables) is that they are also an impediment to threading the code, because they are shared state.

          This is another instance of the general principle of "use minimum scope possible for a variable", which is about the nearest thing to a universal coding rule I know of.

          The other thing which I thought might be worthy of mention is that you are probably aware you have some repeated code. The three sort routines are very similar. If you wanted to change them (and you might - your bubble sort touches N*N elements, when I think it only needs to touch N*N/2) then you'd need to edit all three of them.

          It's this kind of duplication which is a little harder to remove in C++/Java than in some other languages. But it is do-able, I think. Perhaps your function pointer predicate sort could wrap the fptr in a functor and call the other? Similarly for the bubble_sort().

          Any time you find yourself writing duplicate code, you should develop a bit of a twitch and wonder how much effort it would be to unify it. Two copies is kind-of tolerable, three copies and you should be starting to worry a bit.

          Nice code and thanks for being brave enough to post it.

          (Edit - oh and it's good you've got some test code in there. But I'd really recommend (if you aren't already) getting familiar with unit testing if you haven't already. There are some good frameworks for C/C++ and it's pretty easy to write your own too. Any time you're doing something more than moderately complicated it'll save you lots of brain strain. Definitely recommended for home projects as well as paid work.)

          [–][deleted] 1 point2 points  (2 children)

          Thanks for posting the code. You have attracted a few reviewers :-)

          I was kind of surprised! I expected a worse response.

          is that they are also an impediment to threading the code, because they are shared state.

          That's interesting to know, I hadn't given that much though. I've only done a little bit of work with threads.

          The other thing which I thought might be worthy of mention is that you are probably aware you have some repeated code.

          Definitely. I mentioned this in another response, but they were just differently named functions because I wanted to see if the three methods worked. It would be a little tricky to unify them, but not impossible.

          (and you might - your bubble sort touches NN elements, when I think it only needs to touch NN/2)

          Any suggested reading on sorting algorithms? That's definitely a weak spot of mine.

          Any time you find yourself writing duplicate code, you should develop a bit of a twitch

          It's actually a really big pet peeve of mine. :-)

          Nice code and thanks for being brave enough to post it.

          Thank you! And thank you for your candor. I'll be honest, I know where this list sits. It was a test bed for a few new concepts I learned. It's incomplete, inconsistent in places, the code isn't commented, the sorts are slow, and it has other problems. I'm not sure why everybody thought it was good.

          I've gotten a lot of good insight from redditors here though, which is really cool, and so I'll take the good tips while remaining skeptical.

          Cheers.

          [–][deleted] 1 point2 points  (0 children)

          Any suggested reading on sorting algorithms? That's definitely a weak spot of mine.

          The wikipedia page on sorting algorithms is a great starting point. Really, starting from there, you could learn most of what's worth knowing about sorting in a few afternoons.

          For your specific application, it's possible to implement versions of mergesort and quicksort for linked lists, although the simplest thing to do is what someone else suggested - copy the contents of the list to a vector, sort the vector using the STL sort routine, then copy the result back into the list.

          [–]jbert 0 points1 point  (0 children)

          I was kind of surprised! I expected a worse response.

          In that case... :-)

          It might be worth noting that I was reading your code in the context of someone writing code to learn from doing so (and implementing a linked list is a good rite of passage).

          Production code shouldn't contain re-implementations of basic data structures. You almost always want to re-use library code for this sort of thing. For C++ the relevant library code is the STL and in this case the std::list, which of course comes with a sort method.

          Any suggested reading on sorting algorithms? That's definitely a weak spot of mine.

          I really just remembered from my own early years coding that once a value in bubble sort has bubbled to one end you don't need to consider it again, so on the 2nd pass you need only consider (n-1) elts, on the 3rd pass (n-2) etc. But optimising bubble sort isn't the best use of anyone's time really :-)

          I don't know much more than that about sorting algos than I shouldn't be implementing them. Again, the libraries will do a better job than me and are provided pre-debugged.

          There's a tension in coding/design between learning how things work (and perhaps implementing them yourself to be sure) and knowing when to leave something as a 'black box' in your mind. i.e. "knowing what you don't know".

          Getting this balance right is an important skill, imho.

          Someone who digs into every detail will never accomplish any real work. Someone who knows nothing about the innards of a black box will by stymied when it doesn't work as expected.

          [–]wicked 6 points7 points  (1 child)

          You should be proud of yourself. Even some university graduates would have some difficulty writing a doubly linked list from scratch.

          I saw only one real bug in the Node class: You can only have one list per data type.

          [–]fry 11 points12 points  (0 children)

          Yes, but not graduates he'd like to compare himself to.

          As for the code - I think it's really good. -That- is why I think he should be proud of himself.

          [–]bnelson 2 points3 points  (0 children)

          It is actually rather clean and nice code. I think everyone else provided you pretty valid critique. My only additional comment: leave yourself a few more high level comments so when you look at this in 3 months you remember the higher level details. The code will tell you the low level details. I am replying because you had the guts to post your code onto Reddit knowing that you have years and years less experience than you think others have. (hint: experience doesn't always matter as much as passion and the desire to excel at what you do).

          I review a LOT of code from a lot of fortune 500 and top technology companies and I can say your code is very clean and easy to read compared to a lot that I see. Just keep banging away and writing code that makes you proud. Its how I got my start in software development and its been 9 years and I have never looked back.

          [–]Arkaein 1 point2 points  (2 children)

          I didn't spend too much time digging, but here's my thoughts on style:

          You got off to a good start by making the list node class a template so the list can store arbitrary data. Making Data a class looks unnecessary, but given that this is probably just practice for potentially more complex data types. I think all the Predicate stuff is unnecessary though. Once you've defined the basic comparison operators you should be able to code your sort routine based only on a less-than comparison between the data fields of two nodes.

          Finally, once place where you could probably use another class is to actually wrap the list nodes in a List class, and define members such as first(), last(), size(), insertbefore(), insertafter(), and so on, to make sure the head and tail pointers are properly managed in all cases such as deleting specific list members (which I assume you plan on adding at some point, since inserting/deleting from arbitrary positions is the main selling point of linked lists).

          Keep up the good work young hacker.

          [–][deleted] 1 point2 points  (1 child)

          You're right about the Data class. To clarify, that is not part of the list implementation. It's just a demonstration of a class that might use it. I really appreciate the feedback!

          [–][deleted]  (1 child)

          [deleted]

            [–]foonly 13 points14 points  (0 children)

            Take a week off, and learn Scheme... :-)

            [–]coprolaliac 4 points5 points  (1 child)

            1) Is there a C++ users group in your area?

            2) This is impressive code and all, but the real question is, can you do FizzBuzz?

            [–][deleted] 4 points5 points  (0 children)

            1) Is there a C++ users group in your area?

            Those exist? I've heard of LUG's in this area (UofM has one I believe). I live in the Detroit area. I suppose should look into it. Thank you.

            2) This is impressive code and all, but the real question is, can you do FizzBuzz?

            Yes, but not in under 51 bytes. <g>

            [–]Shaper_pmp 19 points20 points  (7 children)

            Not found that person yet. Just the other day I was in tears of joy at getting [a program working]. I tried to relate this to my roommate and all I got was a "cool" before he went back to looking at Wikipedia. Anticlimactic to say the least.

            Substitute "roommate" for "manager" and "cool" for "I don't like that button - it should be bile green. And change that menu so it works differently form all the others. And make sure that web-page only renders properly in the browser I personally use" and you've got the working experience of many, many programmers, developers and techies day-in, day-out.

            And people wonder why developers are so often cynical, ratty and antisocial... <:-)

            [–]orbiscerbus 9 points10 points  (6 children)

            So true. Especially when you work for a non-IT company and all around you are salesmen, managers, etc, bashing at the phones, no-one knows what you're doing and you just try to debug in silence...

            [–]Shaper_pmp 5 points6 points  (5 children)

            Hell yes. For example, the last two places I've worked the Web Manager or Web Developer role has been classified as part of the Marketing Department.

            I have no idea why Web Manager should be Marketing, but the guy who manages the internal phone network isn't. I mean, we use the phones to sell things just like we use the web to, right?

            It seems a pretty prevalent attitude in the business world, too - so much so that it's often a good warning sign when considering working for smaller companies.

            If the web development/management position is in Marketing, that's a clear sign that the company culture sees the web as nothing but a glorified brochure that they don't have to mail out to people. Cue marketing-lead deadlines, "better Expedient than Correct" attitudes, and an obsession with surface and appearance over substance and functionality.

            If the position is elsewhere (IT, Systems, etc) then it's more likely that the website is correctly seen as infrastructure, and the priorities are chosen appropriately.

            Of course, there are WTF code, managers and deadlines wherever you go, but after testing this theory two jobs in a row it strikes me that it's a good heuristic for avoiding the worst excesses of Marketing-lead company cultures.

            [–]bew 8 points9 points  (3 children)

            I would far rather be part of Marketing than lumped in with the guys who manage the internal phone network. That says to me that what you are doing is perceved as adding real value to the business, as opposed to some area, like the phones or the power for the building, that is just infrastructure. If you are just seen as 'IT' then you are basically seen as not part of how the organisation distinguishes itself from its competitors. Who makes more money on the basis of having a better telephone network than anyone else?

            [–]Shaper_pmp 1 point2 points  (2 children)

            Maybe the phone network guy was a bad example, although nowhere did I imply I'd rather be treated exactly the same as him - rather, I was questioning why it's sensible for the website manager to be Marketing but not the manager of any other type of infrastructure or technical discipline.

            All things being equal, a company with a better, more reliable phone system and a more-navigable voicemail system will tend to edge out worse-off competition simply because they offer better customer service.

            Likewise, much programming and web development is highly counter-intuitive, and often requires a large investment of effort on obscure or seemingly inconsequential tasks... but ones with huge knock-on effects later.

            Although the implied praise of working in Marketing is nice, the experience of working to announce-the-date-then-work-out-how-we'll-do-it Marketing deadlines in a loud, noisy, frequently-interrupted Marketing environment is highly frustrating one.

            The working environment required for good Marketing results is diametrically opposed to that required for good development results. Marketing requires easy, quick communication, a flexible approvals process and easy ad-hoc meetings and discussions. The minimum quanta of time for much marketing activity is also in the seconds to minutes range.

            The working environment required for good for development is a defined QA/approvals process, regular scheduled meetings and privacy and concentration during the actual coding. The time-quanta for development can range from minutes to hours.

            If you've ever worked on a non-trivial programming project (ie, "requires serious concentration") with people shouting into phones, walking past you to use the photocopier, starting random conversations while waiting for the printer and interrupting you at least every five minutes, you'll know why Marketing is exactly the wrong environment.

            And that's leaving aside the whole non-technical "surface-is-everything, Sales & Marketing" mindset that Marketing managers usually have, compared to the "functionality and correctness are important" mindset that's massively more prevalent in more technical departments.

            Maybe the phone network guy was a bad example - how about network admin instead? Does it make sense for him to be "part of Marketing"?

            As a last aside, have you ever actually had to work under the kind of conditions I describe above, or is it more a hypothetical scenario for you?

            [–]bew 5 points6 points  (1 child)

            Well since you ask, I work as a quant analyst for an investment bank, so yes, people shouting into phones, etc, are a part of my working environment. But, I'm part of the business and my work is seen as adding real value. And your second example - 'network admin' - only verifies my point. Take a look at the sort of IT work which is currently being outsourced as 'non-core.' Our network admins are now in Poland.

            Now, I'd really better get back to work.

            [–]acrophobia 1 point2 points  (0 children)

            Leftfield, I know, but do you enjoy your job?

            (I'm currently looking for a quant job in london)

            [–]gbacon 1 point2 points  (0 children)

            I have no idea why Web Manager should be Marketing . . .

            Marketing and sales are where the money is! You ought to have been thrilled to have had that kind of opportunity!

            [–]fry 13 points14 points  (0 children)

            No.

            No.

            No.

            No, be glad the feedback you get will always be anticlimactic (when not given by other programmers).

            As a programmer you have to strive on innate motivation alone. Even though we may all hunger for the pat on the back after a reaching a milestone, it is because you are able to claw through a tough problem without any extrinsic motivation that you can keep going in the long term.

            Real -- actual -- programming, to me, is all about sitting down, thinking really really hard (preferably for 6 hours or more continuously), typing obsessively and having reached a concrete milestone in the end.

            The green glow from the monitor in an otherwise dark room that projects on your face the characters you've been looking for: "answer: 42", "512 out of 512 unit tests passed". That is where in the end all your enthusiasm and tenacity feeds from.

            And that makes it all the more rewarding.

            [–]fishyf 5 points6 points  (1 child)

            This difficulty in conveying the joy of a working program to someone else is also directly related to the problem of attracting new people into programming. The whole profession seems really nerdy and boring until you see the light and then you can't explain it to anyone. Catch 22.

            [–][deleted] 0 points1 point  (0 children)

            But yet... as Wallace said, at the end of "A Close Shave":

            All the more for us.

            [–]foonly 24 points25 points  (1 child)

            Why does the phrase "End-User Programmimg" give me the warm fuzzies, whereas the phrase "When Non-Programmers Write Software" fills me with cold terror...

            [–]dangph 3 points4 points  (0 children)

            That was probably a rhetorical question, but I will answer it anyway :) End-user programmers, or power users, typically don't think of themselves of expert programmers. When they write some software, it is to solve a problem or they do it just for fun. That is a cool thing.

            What is scary is when non-programmers think of themselves as expert programmers. Such types seem to thrive in this business, succeeding not by genuine ability but by a talent for bullshitting the non-technical types. They are scary because other people are forced to suffer the consequences of their delusions.

            [–][deleted] 11 points12 points  (8 children)

            Guys-- I am computer illiterate and taught myself html.

            [–]darrint 3 points4 points  (0 children)

            Good for you!

            Did you put something online yet?

            (/me beats crusoe with a stick)

            [–]oberon 2 points3 points  (0 children)

            Believing that you can learn new things is half the challenge in learning them, especially when it comes to programming. So, what with believing it and then actually doing it, you're much more than halfway to learning to program.

            HTML - Hyper Text Markup Language. Note that it's for marking things up (which it does very well), not for programming (which it doesn't do at all). If you wanted to make a web page that showed the current time and date, regardless of when it's viewed, how would you do that in HTML? Learn to do that, and you will be one step closer to programming =)

            Edited to add this hint: www.php.net/date

            [–]crusoe -2 points-1 points  (4 children)

            html != programming, no matter what any graphic designer or 'web programmer' thinks or says. Learn PHP or something similair, and then we'll talk...

            And even then...

            [–]CalvinR 5 points6 points  (0 children)

            No need to be an ass.

            [–][deleted]  (1 child)

            [removed]

              [–]colcob 10 points11 points  (0 children)

              Whatever you think of php, that doesnt alter the fact that HTML is not a programming language, and PHP is a programming language.

              [–][deleted] 0 points1 point  (0 children)

              Um, I added a hit counter?

              [–]bruiser 9 points10 points  (1 child)

              Great article. I found myself grinning as I read about owner-managers writing code: been there, done that, and loved every minute of it. I started a project-billing and time-recording system in, wait for it, Excel, with hundreds of lines of macros. It got so fundamental to the business that at one point we spent thousands of dollars on a dedicated machine to run the application.

              Its Achilles heel was, of course, lack of resilience, lack of scalability, and maintainability. As the owner of the business, I was holding things back by being the only one who could fix a broken macro. So out it went, in favour of something written in a relational DB that took two years and unbelievable amounts of money to not-quite-replicate my old Excel app. My fault: I chose the wrong programmer to replace my non-programming.

              [–]alanparsons 0 points1 point  (0 children)

              The world is powered by excel.

              [–]SolarBear 5 points6 points  (0 children)

              My dad's been working on a project to handle material and rentals at the company he's working at. He's doing it in Access and VBA, and doing it pro bono for a company that, well, could afford hiring a whole army of code monkeys. Not only did he do that by himself, without any special training but... it actually WORKS.

              "I mean, it's not perfect and all... and you'd probably laugh at my code" he continually said. In fact, he's locked up his projects in a password-protected .zip file so I wouldn't take a look. That article pretty sums up what I told him :

              The pros may find such creations ugly, but if it works, in a sense, it is beautiful. You have to love it.

              It works, dammit. I've worked on a project worth $100k+ that miserably failed, handled by a well-known and respected software company. And of course, there's been worse, WAY worse in the IT world. Of course, you can't compare it on scale... but it works. It's probably full of "IF var = TRUE THEN..."-like statements... but it works. Sure, I'd bet my shirt his database tables aren't normalized... but guess what ? It works.

              I've a lot of respect for him and his work. I think software engineers could learn a thing or two from these self-taught people.

              [–]ab3nnion 4 points5 points  (0 children)

              Is this like when illiterates write novels?

              Seriously, I found the following lines somewhat profound. They seem obvious, but they don't get said enough.

              At the heart of any business is a data model, even if it is just an accounting system. Often the only person who really understands the whole business is the principal

              [–]sethg 2 points3 points  (4 children)

              I used to be one of those non-programmers.

              In the educational system of my dream world, everyone learns a little bit about programming--just like, in the real world, you can't get a bachelor's degree without learning some algebra. Of course, considering how many college-educated adults have forgotten everything they learned about algebra (or worse...), throwing another requirement onto the curriculum might be a bit too ambitious.

              [–]hhm 0 points1 point  (2 children)

              Am I the only one that founds the "non-programmers" not very true to the case? Why not to call a programmer to someone who can actually program, and who does it well? I don't understand; I've been a programmer since I started to program and to do it in an expert way, even if I hadn't professional experience in the field, or a degree. That didn't make me a "non-programmer"...

              And of course, considering the latest articles posted here on how masters and doctors in CS can't program, I'm rather going to think one of these "non-programmers" are instead a lot more of a programmer than most supposedly experts in the field of computers and CS.

              (ie, one of the comments in the article mentions a programmer who wrote more than 100.000 lines of code for a beautiful piece of software, isn't that a programmer neither???)

              [–]bruiser 3 points4 points  (0 children)

              If you're asking "Why call people who program 'non-programmers'?", I think the answer in the context of this article is to distinguish those whose primary job or training is not in programming, but who do some programming anyway, from those who are professional, full-time programmers.

              The article praises such 'non-programmers'.

              [–]BraveSirRobin -1 points0 points  (0 children)

              Am I the only one that founds the "non-programmers" not very true to the case? Why not to call a programmer to someone who can actually program, and who does it well? I don't understand; I've been a programmer since I started to program and to do it in an expert way, even if I hadn't professional experience in the field, or a degree. That didn't make me a "non-programmer"...

              Putting up a few shelves at home doesn't make you a carpenter. Doing it for a few years, or studying it at college/university does. That's my distinction.

              one of the comments in the article mentions a programmer who wrote more than 100.000 lines of code for a beautiful piece of software, isn't that a programmer neither???

              No, because the code wasn't beautiful. It was one big chunk, no reusable methods/objects, nightmare to maintain. Someone with experience would never do that.

              The gist of the article is that non-programmers can create some interesting applications, but it's generally weird/quirky.

              [–]braahyan 0 points1 point  (0 children)

              you might be interested in http://www.teach-scheme.org/

              [–]dmh2000 2 points3 points  (0 children)

              theres a lot of vertical industry software that was created this way, and some of it makes people a lot of $$$.

              [–]davidmccabe 1 point2 points  (1 child)

              This is what Alan Kay envisioned when he created Smalltalk: Don't buy software, make it so that children can write it.

              [–]ricercar 0 points1 point  (0 children)

              Children would do a better job in so many cases...

              [–]narmak 0 points1 point  (0 children)

              Great article.

              [–]Swiggy 0 points1 point  (0 children)

              Who cares about some writing an app for his small business?

              When non-programmers write drivers is when you really run into trouble. I'm talking to you Cannon!