News for hackers. Stuff that matters.
Re:Programmers can’t write algorithms without help by starbugs on Monday November 04, 2019 @11:14AM (#21442964)
> Programmers can’t write algorithms without help

And that might be a good thing. How often does a normal software engineer have to write bubble sort from scratch in his daily life? If someone from my team came to me telling me he had to sort an array and wrote bubble sort from scratch, then I'd probably not be very happy with that unless there is a really good reason to spend that time on it rather than using an existing solution.

Re:Programmers can’t write algorithms without help by Tehchops on Monday November 04, 2019 @11:21AM (#21443029)
Purely anecdotally: I've seen online discourse that suggests that the complex nature of the modern web requires FE devs be able to keep at least a couple efficient data-structure traversal tools in their toolbox.

Anyone with more experience could probably chime in.

Re:Programmers can’t write algorithms without help by starbugs on Monday November 04, 2019 @11:25AM (#21443106)
Yes, being able to write a DFS is definitely a good thing. For more complex stuff I don't mind if you need to look it up.
Re:Programmers can’t write algorithms without help by rhinoceraptor on Monday November 04, 2019 @01:43PM (#21444877)
In my experience, most front end performance problems are just unoptimized assets, or huge JS bundles. After that, there's issues where you're doing a lot of unnecessary rendering, for example in a React app, a Redux mapStateToProps function that isn't memoizing an array map, which is causing the whole subtree to re-render on every state update. The only time I even needed algorithmic complexity was implementing a drag and drop control, for a list that could have several hundred thousand elements, and my naive implementation was n^2.
Re:Programmers can’t write algorithms without help by jimbokun on Monday November 04, 2019 @02:30PM (#21445434)
> that isn't memoizing an array map

"memoizing" is a pretty computer-sciencey word, so not implementing a data structure exactly, but still requires knowledge beyond "plug these APIs together."

> The only time I even needed algorithmic complexity was implementing a drag and drop control, for a list that could have several hundred thousand elements, and my naive implementation was n^2.

And if you didn't have an intuition for algorithmic complexity, how long would it have taken you to figure out the problem? And how many times have you instinctively avoided having an explosion in algorithmic complexity, by intuitively picking a suitable data structure or algorithm?

Re:Programmers can’t write algorithms without help by oneplane on Monday November 04, 2019 @11:29AM (#21443173)
I suppose that depends on what a programmer is asked to do. There are many roles and not all of them need the same thing regarding knowledge, computer science or abstract thinking.

If you are in a position where you mostly do the same thing over and over inside a relatively complete framework for a managed or scripting language, you are unlikely to find yourself building data structures, algorithms or understand what a query planner in an RDBMS might be up to. Those positions are far more prevalent than people might think.

On the other side are the people that have to make sure that they get as much speed and/or as little memory usage as possible because they work on software that will scale (i.e. a small data structure that is used to keep track of filesystem allocations - you don't want a slow structure that also eats up a lot of disk space). But there are far fewer people that actually do that, and in theory far fewer people are needed to do that because a 'good enough' filesystem will fit all of those people from the other category. If one filesystem developer can support 100 million managed-language-framework-MVC-website engineers it's a pretty good scale.

Re:Programmers can’t write algorithms without help by a_t48 on Monday November 04, 2019 @11:46AM (#21443406)
Speaking as someone who has had to write performance critical data structures and also someone who does well with whiteboard interviews - there is a large difference between writing an algorithm with the advantage of having time to read, reason, and test your code and doing it on a whiteboard. There are many people who would do a fine job as a filesystem developer but might not be able to pass the interview for it.

The current situation benefits me personally in many ways, but I recognize that it's unfair to many other people.

Re:Programmers can’t write algorithms without help by oneplane on Monday November 04, 2019 @11:51AM (#21443497)
Yes, that is true. At the same time, most of those interviews are of course more about finding out how a person performs under pressure and how a person thinks rather than how well the white boarded shell sort for red-black trees with double-rot13 'encryption' would be usable in the real world.

At the same time I'd hope that we get better at asking questions rather than repeating the same nonsense in every interview. The more people we can work with, the better. Because maybe not everyone is a fit for the position we had in mind, but maybe a less complex position could be filled that way. Often the interviews are rather binary (due to it often targeting a vacancy instead of a workforce role) costs everyone involved much more than it ideally should.

Re:Programmers can’t write algorithms without help by Gunax on Monday November 04, 2019 @11:48AM (#21443452)
I've been a developer for almost 2 years (I know not that long) but I have never even heard of bubble sort. Looking it up, it is O(n^2). Is there a reason this is a common interview question? It doesn't seem like a sort one would ever really use, or at least it has very obscure uses.

I always thought merge/quick sorts accounted for 99.9% of use cases and only ever really learned about those.

Re:Programmers can’t write algorithms without help by cinnamonheart on Monday November 04, 2019 @11:59AM (#21443605)
The logic of bubble sort is so simple that just the description is enough for an implementation. It's a common interview question for the same reason Fizzbuzz is used -- any programmer worth their salt should be able to just write it down.

Insertion and selection sort are also O(N^2), but sorts like merge and quick will use them to sort small sublists in their recursive cases because they are fast when input is small enough.

Re:Programmers can’t write algorithms without help by Gunax on Monday November 04, 2019 @02:16PM (#21445287)
I see. I would hope one would give a description of what bubble sort is during the question.

It's definitely easy to implement, it just had me worried because I had never heard of it!

Re:Programmers can’t write algorithms without help by brozaman on Monday November 04, 2019 @04:20PM (#21446630)
I guess it's a common question because it's usually taught in college because it's probably the simplest after select sort.

Personally I've never found this case myself, but regarding why it's used some times, the O(n²) is the worst case scenario. The best case scenario is O(2n) which is really good, so for lists that are sorted or almost sorted it works well.

Other algorithms like timsort have O(n) for the best case scenario, but O(n) only tells you how many times you go through the loop. Without actually measuring it, I would expect each iteration of timsort to be at more than twice as expensive as bubble sort, so in this case O(2n) would be cheaper than O(n).

When you know with a certain degree of certainty how is the data you expect in most cases, some times it's kinda easy to make a more efficient algorithm than the one that is the best for the average scenario.

Re:Programmers can’t write algorithms without help by tzs on Monday November 04, 2019 @12:41PM (#21444085)
Keep in mind that big-O notation describes how something behaves as the problem size goes up. Something O(n^2) will be slower than something that is O(n log(n)) for large enough n. For smaller n, it is quite possible that an O(n^2) algorithm can beat an O(n log(n)) one.

If you have an application that only has to sort small lists, but has to sort a lot of them, it is quite possible that an O(n^2) sort like bubble, insertion, or selection sort will be better than merge/quick sort.

Among the O(n^2) sorts, insertion almost always will be faster than bubble, so you probably wouldn't actually choose bubble sort.

Re:Programmers can’t write algorithms without help by Gunax on Monday November 04, 2019 @02:19PM (#21445324)
I understand. In a sense merge/quick are 'galactic algorithms' at the size.

It's more just that I am concerned I would be cornered trying to remember what 'bubble sort' is. It's not difficult to write the algorithm per se--just hard to remember what 'bubble sort' means.

Re:Programmers can’t write algorithms without help by kadoban on Monday November 04, 2019 @12:06PM (#21443709)
It's not one you'd ever use in practice (I know of no use at least). It's pretty simple to implement given a short description though, so it can be seen as kind of an "advanced" fizzbuzz.

If someone just says "hey, implement bubblesort", that's pretty awful though. Then it's just testing your memory and/or gating by people that studied a particular algorithms curriculum. (Though _many_ intro algorithms courses go through sorting and most of those mention bubble sort probably)

Re:Programmers can’t write algorithms without help by mark-r on Monday November 04, 2019 @12:02PM (#21443643)
Bubble sort is good for two reasons. First, it's so easy that anybody should be able to remember how to do it. Second, it's slow and everybody should know that and be able to point it out.

It's actually usable for small enough n. I once coded it when I expected n to be 4 or less, and I'm sure the person who replaced it cursed my name when that expectation turned out to be false.

Re:Programmers can’t write algorithms without help by kadoban on Monday November 04, 2019 @12:09PM (#21443731)
For a simple sort you can use for small N, I'd suggest insertion sort. Its constants are better, it performs well on almost-sorted input, and I think it's even easier to implement, personally.
Re:Programmers can’t write algorithms without help by mark-r on Monday November 04, 2019 @12:11PM (#21443763)
Yes, I've heard that suggestion many times since then. I wasn't well versed on the different sorts at the time.
Re:Programmers can’t write algorithms without help by mordechai9000 on Monday November 04, 2019 @12:37PM (#21444045)
I think bubble sort is used in beginner CS classes because it's easy to understand the operation and the complexity. It makes a good prologue before moving on to more efficient sorting algorithms.

I only remember it because a machine language book for the Motorola 6809 used it as an introductory program.

Re:Programmers can’t write algorithms without help by MatekCopatek on Monday November 04, 2019 @11:58AM (#21443602)
I think it's just the simplest sort to describe/implement on a whiteboard.
Re:Programmers can’t write algorithms without help by Sarki on Monday November 04, 2019 @11:32AM (#21443214)
I agree, what's more important IMHO is education/knowledge of existing data manipulation, after all 99% of the work is reuse not pure creation (incremental vs pure innovation).

Algorithmicians (? - well... algorithm researchers, obviously) and programmers are not working in the same field of work, even though the boundary might seem thin for most, there's a world between both.

Must all painters be artists?

Re:Programmers can’t write algorithms without help by starbugs on Monday November 04, 2019 @11:36AM (#21443256)
I would go as far as saying that an "artist" might be detrimental to reaching your goal in a lot of cases, especially if a team is involved.
Re:Programmers can’t write algorithms without help by mark-r on Monday November 04, 2019 @11:46AM (#21443403)
To stretch the analogy to the breaking point, you probably don't want an "artist" to paint your living room walls.
Re:Programmers can’t write algorithms without help by nraynaud on Monday November 04, 2019 @11:43AM (#21443361)
And also, even if the sort was important in my app and there was a superior compelling reason to rewrite it internally (one common case is computing 2 things at once), I would probably google what people in the domain do and think first, try to find a few blog post from people who implemented a sort to look at tradeoffs (getting a feel for the politics is in the domain: they probably critiqued each other's "real life" loads, optimization goal: memory vs. CPU vs cache), and then find something on github that I can follow, and do my tweak on.
Re:Programmers can’t write algorithms without help by mark-r on Monday November 04, 2019 @11:56AM (#21443570)
I was once asked to sort a singly linked list in an interview, and the bubble sort was the only one I could think of at the time. This was a small part of a larger coding test that I think was based on a problem they actually ran into, which a previous employee had solved badly. I got a low-ball offer and turned it down. It wasn't until a couple of years later that I thought about that problem again and realized a merge sort would have been perfect.
Re:Programmers can’t write algorithms without help by AnimalMuppet on Monday November 04, 2019 @11:45AM (#21443395)
I agree. In a world where good standard libraries exist, and where Google exists, why would a good software engineer write any of the standard algorithms from scratch?
Re:Programmers can’t write algorithms without help by klyrs on Monday November 04, 2019 @12:49PM (#21444200)
One thing I find myself implementing repeatedly is the Union-Find datastructure. I never just need that though. Sometimes I need statistics about the disjoint sets, which inevitably means a custom Union implementation. Sometimes I know more about how often Find will be called, where I can get better performance without doing full path compression.

Another one I've encountered recently is priority queues. Here, memory requirements and operation runtimes depend on which operations are supported -- insert/pop heaps are faster than insert/decrease/pop heaps are faster than insert/update/pop heaps. And if heap operations are your innermost loop on your critical path, you can get huge gains from rolling your own -- because a standard library's priority queue will support whichever operations it supports and you can't pick features a la carte.

But no, I never do this without a search engine handy.

Re:Programmers can’t write algorithms without help by jcranmer on Monday November 04, 2019 @01:28PM (#21444682)
Union-find is one I find needing a fair amount too, although it does make algorithms tricky to debug if the problem is a bad union ("which union was the bad one that caused all these groups to collapse into one?").

But even for these simple data structures, I am much more comfortable implementing them with an algorithm textbook in front of me (or some other resource with similar level of detail), simply because it greatly reduces the scope for implementing the data structure itself incorrectly and, secure in that knowledge, I can focus my debugging on the algorithm itself.

Re:Programmers can’t write algorithms without help by dickeytk on Monday November 04, 2019 @11:39AM (#21443311)
I get your point, but why would you pick bubble sort?

That’s one any engineer should be able to implement without any help. It’s the more complex/useful ones worth discussing.

Even Obama knows this: https://m.youtube.com/watch?v=k4RRi_ntQc8

Re:Programmers can’t write algorithms without help by starbugs on Monday November 04, 2019 @11:42AM (#21443338)
I picked bubble sort, because it's literally the example from the first sentence of the article:

> David Hansson, the creator of Ruby on Rails, admitted in a tweet that he wouldn’t be able to write bubble sort on a whiteboard.

Re:Programmers can’t write algorithms without help by dragontamer on Monday November 04, 2019 @11:44AM (#21443380)
I wouldn't be able to write a bubble-sort specifically.

But if I were asked to "sort" a set of numbers, I'm sure I'd come up with some unholy combination of bubble, selection, and insertion sort that got the job done.

I always have to consult the books to remember the difference between bubble, insertion, and selection sorts. But even without documentation, surely people can write a list of numbers (ex: 9, 4, 5, 3, 2, 6, 0, 1, 8, 7), and then tinker with an algorithm until that list was in order? (0 1 2 3 4 5 6 7 8 9)

------------

Here's the thing about programming: you don't have to travel very far before you get into the "nobody knows the answer". The internet provides enough information for the first ~2 months on the job. Specialized books on your topic (ex: GPUs, HPC, OpenMP, etc. etc.) may cover another 1 or 2 months of training on the job.

After that? Nobody in the world is doing what you do. Nobody has to work with your particular configuration of tools, your particular problems (performance? Bugs? Architecture?). Your particular office politics. Literally no one else in the world. And yet, you'll be responsible for coming up with a solution that works, even without any guides.

That's why people like testing people "without the internet". Because in most cases, there's no guide to tell you how to progress a real project in the real world.

Re:Programmers can’t write algorithms without help by a_t48 on Monday November 04, 2019 @11:51AM (#21443487)
Mergesort is also worth looking into.
Re:Programmers can’t write algorithms without help by dragontamer on Monday November 04, 2019 @12:06PM (#21443707)
Strangely enough, I always found quicksort easier to write than Mergesort. But that's probably just how my mind works.

Hmmm... with Mergesort, you gotta be copying the data to new buffers, malloc-ing arrays and new arrays, managing the data etc. etc.

Quicksort can be trivially done in-place. And yes, I know Merge-sort has an in-place variation, but in-place Mergesort is non-intuitive IMO.

-------

I guess merge-sort is easy if you are willing to call malloc / free (or new / delete) over-and-over again. But those functions scare me. I prefer to get things done without dynamic memory, especially if its a whiteboard interview.

Quicksort does require more brainpower than selection / insertion / bubble sorts. But if I were to use a recursive methodology, trying to do quicksort would be my strategy.

Re:Programmers can’t write algorithms without help by a_t48 on Monday November 04, 2019 @12:17PM (#21443821)
Mergesort sticks in my memory better, for whatever reason. And yes, definitely agree that in real life, avoid those allocations. For a whiteboard interview, declare an std::vector and call it a day, no need to manually call new and delete.
Re:Programmers can’t write algorithms without help by mark-r on Monday November 04, 2019 @12:05PM (#21443691)
Merge sort is wonderful. Not only is it as easy to remember as bubble sort, but is there anything else that can work with data that doesn't all fit in memory?
Re:Programmers can’t write algorithms without help by seba_dos1 on Monday November 04, 2019 @11:52AM (#21443509)
It's either an exaggeration, or his mind works in some very special ways.

You don't need to memorize multiplication table to be good at math, but this is an equivalent of saying "I wouldn't even be able to add two numbers together in my head!".

Re:Programmers can’t write algorithms without help by dickeytk on Monday November 04, 2019 @11:46AM (#21443412)
Oh my, I’m that guy today.

Whoever said it, I have a super hard time believing DHH couldn’t implement bubble sort on a whiteboard.

Am I the only one? I get that people hate whiteboard/algorithm interviews, but bubble sort?

  for i = 0..n:
    for j = i..n:
      if arr[i] > arr[j]:
        arr[j], arr[i] = arr[i], arr[j]
Everyone in this field should be able to do this, maybe not right away, maybe not without bugs, but with help within 45 minutes.
Re:Programmers can’t write algorithms without help by LandR on Monday November 04, 2019 @11:55AM (#21443551)
Yeah, this is barely a step above fizzbuzz.

If you can't do that without help in 45 minutes, what can you actually do?

I think the actual problem is most developers / programmers are just bad at the job, and then go in a huff when this is pointed out.

Re:Programmers can’t write algorithms without help by eesmith on Monday November 04, 2019 @03:30PM (#21446140)
Now I get to be that guy. Your i only needs to go to n-1, and your j can start with i+1.

More importantly, what you wrote is a selection sort, not a bubble sort!

A bubble sort swaps neighboring terms. Eg, if I interpret the code in 2.1 of https://users.cs.duke.edu/~ola/bubble/bubble.html correctly, the 'definitive' version is:

  for i = n-1..0:
    for j = 0..i:
      if arr[j+1] < arr[j]:
        arr[j], arr[i] = arr[i], arr[j]
Re:Programmers can’t write algorithms without help by dickeytk on Monday November 04, 2019 @04:33PM (#21446736)
Fair point. Perhaps it is harder than I thought without looking anything up or testing? At least to get the canonical version written down.
Re:Programmers can’t write algorithms without help by eesmith on Monday November 04, 2019 @10:40PM (#21449386)
I think it's that "bubble sort" has come to mean "a simple O(N²) sort implementation", of which there are many. But the selection sort just feels more natural than the actual bubble sort. At the very least, selection sort doesn't get my face to scrunch up in a scowl at all those memory movements.
Re:Programmers can’t write algorithms without help by jcranmer on Monday November 04, 2019 @12:02PM (#21443652)
Off the top of my head, I could write selection sort, insertion sort, merge sort, quick sort, and with a few minutes of thinking about it, even heapsort. But bubble sort? It's a useless sort, even worse than selection and insertion sort, which have their advantages in certain circumstances. So I don't bother to remember what the algorithm for bubble sort is in the first place.
Re:Programmers can’t write algorithms without help by seba_dos1 on Monday November 04, 2019 @12:08PM (#21443726)
Do you learn algorithms by blindly memorizing their steps? There's nothing to remember in bubble sort, if you know that it "bubbles" by swaping the elements you're already done.
Re:Programmers can’t write algorithms without help by jcranmer on Monday November 04, 2019 @01:40PM (#21444848)
I learn algorithms by memorizing their general structure and filling in gaps using the invariants of the process. A selection sort is pulling the largest elements to the end of the list; an insertion sort sorts the first N elements and inserts the next element; a quick sort picks a pivot to divide the list for sorting; mergesort sorts half the list and then merges them; heap sort heapifies the input (this takes me some time to remember how to do efficiently) and then pulls out the top repeatedly.

But bubblesort? There's no invariant. Sure, I can tell you that it's this structure:

    for i = ? .. ?:
      for j = ? .. ?:
        i1, i2 = ?, ?
        if A[i1] < A[i2]:
          A[i1], A[i2] = A[i2], A[i1]
But, with the lack of invariants, I don't know how to fill in the ? correctly. With trial and error, I could write a correct sort from this template. But insertion sort and selection sort also follow this template (as does any other sorting network if you try hard enough), and I can't guarantee that I'd hit bubblesort instead of those.
Re:Programmers can’t write algorithms without help by seba_dos1 on Tuesday November 05, 2019 @09:45AM (#21452776)
I don't buy it. Bubble sort is the simplest, the most naive one, you don't even have to remember anything about it.

  do
    sorted = true
    for i = 0 .. n-1:
      if A[i] > A[i+1]:
        A[i], A[i+1] = A[i+1], A[i]
        sorted = false
  while not sorted
That's already a perfectly valid bubble sort. You can then optimize it by noticing that after nth iterations nth elements will already be sorted, and you're done.

If you're trying to recall this algorithm from memory by comparing it with other sorting algorithms you've memorized, you're probably doing it wrong, because there's hardly a place for real world usage of bubble sort, so your memory of it is naturally going to fade away. The trick is - you don't even need to memorize it or recall any structure to fit it into. Just imagine an inefficiently bubbling array of numbers in your head and that's it.

Re:Programmers can’t write algorithms without help by dragontamer on Monday November 04, 2019 @01:33PM (#21444755)
The main "issue" I have is that if you write a "bubble" sort backwards, then its suddenly insertion sort instead and much more efficient.

For people who know about knots out there... its like asking for somebody to tie a Granny Knot instead of a square-knot. Anyone who actually practiced knot-tying will "accidentally" tie a square-knot instead (because the square-knot is stronger for the same level of effort).

Similarly, bubble sort is the "bad" way to write insertion sort. Anybody who actually practiced writing sorts will write insertion sort by accident instead.

Re:Programmers can’t write algorithms without help by seba_dos1 on Tuesday November 05, 2019 @09:46AM (#21452793)
I'm pretty sure the original meaning of "I can't even write bubble sort on a whiteboard" wasn't "I would accidentally write a more efficient algorithm instead" ;)
Re:Programmers can’t write algorithms without help by clarry on Monday November 04, 2019 @11:49AM (#21443455)
> That’s one any engineer should be able to implement without any help.

If I wrote it down every time someone claims that "this is so important any engineer should know it," I'd have a book as thick as the bible full of trivia. All of it so easy, and yet in every position you can find a person who hasn't mastered it all. Maybe it isn't all that important after all. Most of these people are capable of finding help should it come to that.

Re:Programmers can’t write algorithms without help by dickeytk on Monday November 04, 2019 @11:55AM (#21443547)
I’m not saying that it’s important, I’m saying it’s trivial and an engineer should be able to figure it out. Bubble sort that is.

Merge sort? Quick sort? Bogosort? Maybe not. But bubble sort yes.

Just like an engineer even at the most junior level should be able to swap and write fizz buzz. If you can’t do that you certainly cannot call yourself an engineer.

Re:Programmers can’t write algorithms without help by tiborsaas on Monday November 04, 2019 @12:08PM (#21443725)
> And that might be a good thing.

- Graphics

- Machine learning

- Gaming

Imagine yourself working in these fields and not being able to implement algorithms, you wouldn't be a super useful teammate.

Re:Programmers can’t write algorithms without help by starbugs on Monday November 04, 2019 @12:33PM (#21444004)
Being able to write algorithms is a different thing than being able to do it without any reference or documentation on the state of the art, basically from scratch and from the top of your head, as commonly found in interview situations.

The point is that as an interviewer/employer you risk not getting the information you've asked for. Someone who is able to memorize interview algorithms isn't necessarily a good fit for the role you are trying to fill. Forcing people to memorize the details of these concepts just to comply in an interview is often a waste of time for both parties.

Even as a gamedev/ML guy you don't have to reinvent the wheel everyday. You have to understand what is available, judge about the pros and cons of different solutions, pick the right one and build a good system. Preferably on time.