The gap between learning code and producing usable software
yassine.substack.com
yassine.substack.com
If you've got more of a taste for the slower-changing, thoroughly unsexy principles behind writing stable and maintainable software, I'm devoting myself to exploring these ideas with my screencasts - topics like data integrity, building instrumentation for knowing what's happening in your code (esp. in production), non-brittle tests, leaning on unix tools and the OS to debug things, the timeless editor vim, etc.
The first 12 videos are available over at https://www.semicolonandsons.com/ -- it's a new side-project of mine that I hope will bring some value.
But...as a desktop user the video player only has two screen sizes...too small to be readable and full screen which is pretty useless because I like to multitask. Could I suggest offering different sized embedded players, or something that resizes with the browser window?
Hope you don't take this as negative criticism.
youtube-dl https://www.semicolonandsons.com/episode/sql-cascade-transactions-db-design -fhd_mp4-720p
# -F for alternatives to hd_mp4-720p
works fine. (I don't care for video tutorials (vs text) due to temporal illegibility (things not being on screen long enough to read), but it definitely looks readable enough in terms of spacial size.)Additionally you can then watch the movie and have i.e. your terminal open.
I use the Wistia player and it seems to be fully responsive on page resizes -- the issue is more that the player is constrained by the size of its column in the css. I'll put that on the list of things to sort out once I get around to hiring a designer. The css at present is an extremely rough proof of concept.
javascript:(function(){document.querySelector('.lg\\:mx-8').remove();document.querySelector('.lg\\:w-3\\/5').setAttribute('class', 'w-full');})()
It removes the right hand panel and the width restriction in the player's containing div. Until of course you change your markup :)I don't think going wholly to the other end of the theory-praxis spectrum is the answer in addressing the gap :-)
There is a good main thrust here but requires a lot of work/editing to be really useful IMO.
I really think more established apprenticeships would be good for the software industry. This is a list of things that you only learn if you have been through launching a product, and it takes a few years of experience to have a chance to both do it and have time to digest and understand it.
Also almost 30 points on a business advice article with no comments, smells a bit fishy.
... ability to perform complicated abstract reasoning, ability to reflect on own performance plus some experience.
Almost everybody is able to perform simple programming tasks in isolation. For example, follow a tutorial to build simple app using framework X or google solution to problem Y and ctrl-c/ctrl-v into your codebase.
Complicated abstract reasoning is necessary to be able to put together abstract concepts, flows, in new patterns that are required by the application.
Ability to reflect on own performance is necessary to learn from mistakes, look critically at the code, understand strengths weaknesses, evaluate solutions, etc. A person that lacks ability to reflect on own performance might be for example deaf to complaints of other people, might be blind to problems with the code they are producing (for example overcomplicated code), or trying to find faults anywhere else but themselves.
If you can't reflect on yourself you are cut off from being able to effectively learn and improve and this is critical to being able to produce usable software.
Regardless of how intelligent and self-reflective you are, some experience is needed.
> Getting hooked on computers is easy — almost anybody can make a program work, just as almost anybody can nail two pieces of wood together in a few tries. The trouble is that the market for two pieces of wood nailed together — inexpertly — is fairly small outside of the "proud grandfather" segment, and getting from there to a decent set of chairs or fitted cupboards takes talent, practice, and education.
- Poul-Henning Kamp
Similar with programming. If you core product is software, you should probably have an expert. However, if the software is just ancillary; you can often get by with just the basic skills.
[0] Maybe assembly lines; but with modern manufacturing technology, I doubt that is the case anymore.
This seems like it's kicking the can down the road. It is like saying that people need the ability to perform memory. It's tautologically true that these are both necessary for complex learning.
A lot of the challenge for learning systems is figuring out how to help people develop the mental schemas they'll be pumping abstract reasoning through. (Similar to the design of procedural pieces, which most coding lessons focus on!)
I know very intelligent people who, nevertheless, build shit software because they think they are right and everybody around them is wrong. You can't identify and streamline anything unless you are first open to opinion.
I got that through years of providing helpdesk service to end-users, and it's staggering how much UX kludginess gets into production that would have seemingly been caught by watching 1-2 people (other than the software authors) actually try to use it.
Those responsibilities are ostensibly handled by other business units, but that either doesn't actually happen in startups (what's a design team? we don't have one!) or would be smoothed by the engineering side having a basic foundation of the concepts involved, enough to understand the rationale behind UX stuff and challenge bad design before it gets in front of users.
Even more directly, someone has to operate (from the back-end, not as an end-user) the systems you build, and usability (or even existence of) tools for that is often terrible.
A thing I always do when doing UI work is actually try to use it. I feel like that is glossed over by my coworkers so often and it's maddening. Yes, you might have fulfilled the specific wording of the ticket, but we're going to get a bug report as soon as any user actually touches that interface.
> Don’t keep “Logs” (similar to print) when building for production!
Not logging in production code is a recipe for not being able to fix some key user problems. Remote logging is mandatory for a high quality app.
Wait, what?
This is one of the areas, where strong types can help you. Have all your sensitive information in separate types from your non-sensitive info. For example, if you store the user's name in a type called SensitiveString, you can write methods/traits/overloads/etc that can either make it a compile time error to log a a value of that type, or log a placeholder - ie "SenstiveInfoHidden*". This also helps ensure that you don't accidentally assign or append sensitive information to a non-sensitive variable. Put the compiler and type system to work for you.
I suppose the actual contents of the article makes sense for apps on a specific platform, but I feel like there's a more generalizable set of lessons that fit the bill for "all of the problems you get once your hacked together app/website/service has real users."
You can read the introduction[1] to the series to get a better sense.
[0] https://twitter.com/algo_luca
[1]https://www.lpalmieri.com/posts/2020-05-24-zero-to-productio...
The article brushes with some of these but misses the mark overall.
I like to think that my early ability to create code, a make file and package it up into something that just worked really helped my career early on.
Aren't we supposed to log exceptions in production? How would you know if your software has unknown problems otherwise?