Software Development
Table of Contents
Start here
I assume you are teaching yourself at the same time some kind of intro course you found on YouTube or a book/curriculum somebody recommended such as:
- Accelerated Intro to CS
- two compsci semesters compressed into one
- Functional CS
- the math model of programming (category/type theory)
- SICP
- w/Sussman's new book on programming adaptive systems similar to biology
This workshop here is about getting paid as a software developer.
Motivation for creating this
This is not a 'work in fintech' workshop but it was born from conversations I have with trading shop recruiters during work socials that I routinely run into who tell me a tale of woe how much harder it has become to find good entry-level candidates from schools so I asked them what would a non-degree candidate need.
Their optimal candidate:
- has a very high standard of code quality
- knows about the CPU-arch execution pipeline and cache architecture
- what can cause a cache eviction
- knows how their chosen language's runtime works
- memory allocation can happen deep inside library code you import
- using free can add complexity (look how many lines of code it has)
- knows the standard algorithmic problem-solving strategies
- divide/decrease and conquer, transform and conquer, dynamic programming (min/max)
- knows at least the basics of probability or can teach themselves
- depends on role but translating MATLAB/SageMath programs is common
- is at least familiar with writing multicore code/concurrency
- knows what they don't know
- they catch the candidate bluffing during the interview and ask them to define on the spot any jargon used
If you have high standards you only need to satisfy 40% of the rest of that list to be considered a great hire because you can be trained to learn everything else including whatever customized tooling/compilers or languages these firms use.
The work
There are many reasons why you'd want to work for trading firms (besides the money) and most of them like Valkyrie will hire juniors.
Every day you are the race car engineer of software like how they will rebuild an engine and retune the car after each race to squeeze out more optimization that's what you do at many of the fun firms. There's also work in building high-performance math/AI models and fancy client dashboards.
Recruiters
Jove Intl, Oxford Knight, Reload Search, and ex-employees who have quit to become recruiters. They hire internationally for Chicago, NYC, Austin, London, Sydney, Hong Kong, Mumbai, Shanghai, Tokyo, and now Singapore seems to be the location everyone is opening offices these days. LinkedIn is trash but works fine for harvesting recruiter offers.
Selection
I got to try their fancy recruiter tools and paid access to LinkedIn to see the minefield of bad candidates they have to filter.
They told me all resumes are reviewed manually there's no automated ATS or applicant tracking system. USACO training or competitive background in anything from sports to math stands out, so-called modern C++ meaning C++20/23 stands out but is not necessary as any firm will train you. You never advertise yourself as a junior, companies will hire anyone who knows how to sell themselves and can pass the competence filters.
Campus recruiting
Getting more and more monopolized by big tech corps pressuring students with 2-week expiring offers (aka exploding offers) that are against campus hiring guidelines but they do it anyway. Think about how much money is spent on campus engagement to find (highly paid) interns and they have to hope the intern comes back after graduating and many don't. This should tell you how motivated they are to find junior candidates willing to stay to become senior staff so if they find you as a rough diamond in a sea of mediocre trash it's an easy investment for them.
Phone screens
I don't know if they still do this but one Chicago trading company was notorious for firing off 3 problems to solve on HackerRank immediately after applying online. The 'phone screen' these days is usually Coderpad where they expect you to have a webcam and mic or test gorilla/codility/hackerrank where they also want to take pictures of you at random intervals to see if it's actually you doing the test as too many frauds have ruined it for everyone else. We'll learn all about Coderpad below.
The new fizzbuzz filter is to implement atoi and tests how careless of a developer you are meaning you don't ask any questions about requirements and start writing code immediately. Here is a typical Coderpad used screening interview and there may be more than one of these because the amount of investment that goes into hiring someone new due to training aka 'onboarding' which I've been told by recruiters is typically 3 months. Imagine you are hiring developers and paying them $160k/year what would you do to ensure whoever you are paying ~$40k for 3 months of training turns out to be a good hire?
On-site
If you pass this then you are paid to fly out and do a 'super day' or sometimes multiple days that's where you do back-to-back interviews and job shadowing. You are often interviewing for every job in the company not just the one you applied for as they will see where you best fit so if they start asking you about math or fermi style problems they may think you are better placed in trading or even as a research assistant which is great news as the pay is much higher.
During each interview you are given either a deceptively simple problem to solve that is a trap (see below) or an impossible problem to solve where you are repeatedly asked to justify all reasoning and then told why your reasoning is wrong. Don't worry everyone is told their reasoning is wrong you aren't failing the interview they are seeing how you react and the next task they give or future interview you should have adapted. They may ask you how long you think it will take you to solve this and if you have a large confidence you can solve it they'll ask you how much would you bet that you can solve it if we gave you 100 poker chips. Never say you can solve it with 100% confidence and go all in. There will be someone eventually in these interviews who goes through your entire resume and tests you on everything there so if you write down that you know Java they will ask you to describe in detail how the garbage collector works or the virtual machine. It's fine if you don't know but say you don't know don't start bluffing.
The trap problems I've seen have an obvious area of optimization to take advantage of to squeeze out some pointless constant factors but will open a potential bug or performance sink elsewhere if you aren't taking your time thinking through the whole problem space and asking questions. The bad candidate will pounce on that and show off their meaningless optimization while the good candidate will ask what happens if I do X, is it a good tradeoff for the risks involved? An example they will try and get you with is cache invalidation either as a mistake you made or asking you when is it a good practice for the cache to be invalidated in some program you're writing.
Where do you learn how to justify your decisions? Game Theory which is a bag of analytical tools that teaches you about decision-making. The entire interview process could be considered a strategic, multi-round game.
Find a mentor
Once you are in and develop a routine meaning you are no longer panicking try and walk over to the department where all the money is being made and find a mentor to teach you by asking them to give you the work they don't like doing because you want to learn it all from scratch. All you have to do is be the reliable person they turn to whenever some (tedious at first) work needs to be done and if this work over time becomes increasingly more skilled then you have found the right mentor and you are set for life because they will eventually want you to work with them once you have proven to be indispensable. If they get promoted you get promoted, if they go off and start a new company you are the first hire. This can be tricky because of signing multiple NDAs even between internal departments but if you are serious about wanting to learn they will tell management to make it happen. I took all the above advice from a comedian many years ago and my life would not be the same if I hadn't watched that throwaway clip at 3 in the morning because I always assumed there was no way I could ever do this kind of work.
If you're not interested in finance there are a few companies that mentor developers sometimes even direct from local high schools and build them to senior developers. One is in New Hampshire called Northwoods Software. If you live in Egypt, Georgia, North Macedonia, Albania, Latvia, or Bosnia you can work remotely for Scandiweb (Latvia). The pay is only 500-600 Euros per month but you don't know anything yet so are being paid for direct mentorship to become a senior developer.
Curriculum
Designing Software
- MIT's 6.1040 Software Design
We audit this briefly to see how to design software people enjoy using and why certain software is successful and others aren't. It gives you a complete analytical toolkit for design.
Building Software
- CMU 15-721 Advanced Database Systems
This is a course on how to build modern large-scale applications. We learn analytical databases and their internals from how s3 Amazon buckets work, how low-latency networking works, search space complexity reduction and designing microservices. If you look at showcase it's an example of what we'll be doing which is building out some critical part of the application either I/O, query optimizer, buffer pool manager, or whatever it is you want to build that is taught in the course. The prof Andy Pavlo teaches the features/tradeoffs you may want to consider then we write the code from scratch in your preferred language. We will learn about performance engineering, the basics of operating systems, and even some Queueing theory.
A database is a state managing system just like how React is a framework to manage state.
Job Interviews & Assessments
Passing screenings, assessments, on-site interviews.
- The USACO guide & CodingGame
- These lecture notes from OCW on basic algorithm design
USACO training is excellent and it's completely free. This is where we learn algorithmic problem-solving strategies for seemingly impossible tasks. CodingGame is made by CoderPad and you almost certainly will have to use CoderPad for an interview screening.
- A workbook on languages
This is a workbook not a large theory text on the standard model of programming languages it uses a web-based stacker to see exactly how programs execute.
You are now a working developer
Your first task is to sign into either Creddle.io or Google Docs and select a resume template. You want the simplest template and if it has colors change them to black. You don't want a summary or anything.
In the skills section write the skills you want to have. You are now a 'full stack' developer who specializes in high performance applications. Go here and skip down to Lecture #17. There is lectures on Google Dremel/BigQuery, Databricks/Spark, Snowflake, DuckDB, Yellowbrick and Amazon Redshift. Add those to your skill field so long as you actually plan to take those lectures. Look at the fall 2024 semester and add Confluent and Kafka too. Write you know how to write a FPGA memory controller if you plan on doing that content later. Write you know whatever your favorite language is but by the end of this you will defacto know every language at the memory model level.
In the experience section write you are a 'Freelance Software Engineer' because you are. Give yourself only 1-2 years of experience because you probably do have that experience if you did any introductory CS courses or hacked together some software on your own. In the bullet points write about how you can architect and construct from scratch the internals of online analytical systems because you'll be doing this. Write you know about kernel-bypass methods for low-latency networking and you know about DRAM read disturbances (rowhammer/rowpress). If there is a skill you wish you had and are in the process of gaining then write that here. If you had other jobs put them in here too but don't lie about working for a company.
In the education section write 'USACO Guide Competitive Programming Training' and write that you help complete the USACO guide and mentor other students because you will as we'll be taking it and there's a forum where you can mentor or submit solutions for the guide in other languages. Don't lie about having a degree this is easy to check.
You don't have to list your GitHub on your resume as almost no one checks it anymore since there's no guarantee you didn't just copy everything there.
You are now the perfect candidate you have enough experience you won't demand a million dollars to start and you are highly motivated/diamond in the rough hire as you have USACO training so have a competitive spirit. All these outfits look for someone exactly like this who can train themselves and has a spark of curiosity for solving seemingly impossible problems without giving up immediately.
It's too early yet but when you get at least halfway through this workshop you want to make a LinkedIn account and add the same thing there for baiting recruiters. Do the same thing here making a profile and if you are an American then make a profile here it is the 'right-wing' equivalent to ycombinator but there are interesting startup jobs inside and politics is a meaningless distraction really.
I originally learned this from a turbo redneck who dropped out of high school I met once while I was a teenager working on the docks doing wire rope rigging. This is where you stab a metal spike into very thick wire rope, unravel it to make loops and press them so cranes can lift stuff on to cargo ships. Extremely dangerous, you'd be in the rain beside a ship and the spike would be under so much tension if you slipped it would rotate a thousand times and come out flying at your face. The guy training me said that every job he's ever had he lied about his experience like the time he claimed to be a professional diesel mechanic and was underneath the truck reading a repair manual as he went. He told me he would work late into the night just teaching himself whatever trade skills he had managed to fake until he made it.
Your first job
While you do this you should get paid to do code review. The easiest way for anyone on earth to do this is by applying to those shady LLM prompt verification companies. Here are a few of them I tried but if you search there are dozens more:
- Alignerr
- the best I've found but they all have problems
- Data Annotation Tech
- Outlier.ai
They pay hourly anywhere from $15-40/hr to evaluate the code that an LLM comes up with when given a prompt. These outfits are notorious for expecting 100% quality all of the time and if you make a single mistake expect to be ghosted with no new assignments. Some have unpaid training or seize your income if you don't transfer it out so you must treat it for what it is which is a side gig to get paid doing code review not your primary source of income. Their platforms are filled with spyware watching if you cut + paste answers too quickly therefore you can't really judge 90% of the online reviews for these companies because the scammer when he's caught will run to the internet and scream the loudest.
Alignerr was the only one I found where you can do the code assessment tests (Python or JS) without having to be monitored by webcam/audio which takes pictures periodically to make sure you're actually the one working to avoid someone setting up an agency and outsourcing. They use TestGorilla so a timed test and if you look at the sample question there for 'Arrays test' it's dynamic programming and depth-first search to get the highest points though you could brute force that solution and probably still pass. The two others had much more simpler tests (using requests library/parser like beautifulSoup) but don't pay as much. CMU has a web scraping tutorial and recorded lectures here.
Your second job
If you want to freelance then contact designers (see design review below) and use the skills we will shortly learn for conceptual design. You're now an agency.
You can also apply to 10x Management, Braintrust, TopTal, Unicorn, Bairesdev and these are actually legit though of course very flawed freelancing middlemen. They use everything from TestGorilla to HackerRank/Codility for initial assessments then an easy interview usually you get a take home project and have to explain how it functions to them. Any tiny mistake they catch before you do and you are probably finished so don't rush it. They also look for performance which you can learn here.
If you want to work in finance then contact the above recruiters or read this how he targeted companies he wanted to work at and fished for referrals. Some places offer a bonus to employees if their referral is hired though not all. Where I am bills whoever handed out the referral the total cost of interviewing if the referral fails the interview so don't be discouraged if they tell you nope can't do it. Here is walkthru of what you should expect.
Software Design
MIT has a course 6.1040 Software Design and the professor of that course wrote a book The Essence of Software. This is a way to design software on a piece of paper so that when it comes time to code the app it essentially writes itself. We will also learn why some software succeeds and others fail.
See this video where the professor of this course further explains what a concept is and how you would use a bunch of state machines to get an LLM to develop an entire web app. State in a concept means 'what it has to remember'. In their experiment, they had to use 'a few hundred' prompts which then become your version history and I can only imagine the nightmare of trying to refactor those prompts.
Audit through these slides first then see the tutorials and case studies on his book website when you are planning on building something from scratch:
- Diverge/Converge brainstorm ideas for your app then turn those ideas into concepts and work out the interface they will each need. In the tutorial for divergent design on the prof's personal site he used Chat-GPT to suggest additional features.
- Wireframing recitation. If you go on Upwork or other freelancing sites you will see many jobs looking for someone to take a figma design and turn it into a working app. We can use a piece of paper to wireframe or hire someone to use Figma after giving the conceptual design plans.
- To watch the lectures on concepts see here, skip the 'message of the day', and scroll to the very bottom of the materials list where there are 6 lecture videos.
- More Concepts and at the end of these slides you have a complete draft of an application that is now trivial to code into an MVP or minimum viable product.
- Design moves how to unify or loosen concepts with many examples here like Zoom's screwy interface or Gmail labels.
- API design what a RESTful API is.
- Data design there are also recorded lectures here. NoSQL is introduced which you never want to use if not writing a temporary prototype as doing updates and inserts as JSON is a convoluted mess.
- Make things learnable anyone should be able to figure out your software without overly relying on documentation. Notable examples of software where you cannot do anything without extensive docs are Tailwind CSS and Git.
- Good UIX design basics.
- Design innovation what was novel about Zoom? Why did everyone use it instead of FaceTime, Meet, Microsoft Teams etc?
It's worth reviewing the slides on ethical software where they show an example of someone who made a traffic routing map that ended up sending a horde of jackasses speeding through some small residential neighborhood.
Here's the quick rundown:
- Open the tutorials (book site) for reference
- Look at the case studies as you go
- Brainstorm ideas of things you want to make
- Use Chat-GPTx to come up with features you didn't think of
- Converge these ideas into reusable concepts
- Split concepts like in his examples where an expiring resource is a familiar concept and can be reused by other concepts
- Figure out what each concept needs to remember when it's used and what it consumes
- List of Actions (state)
- Audit your concepts and see if there is an unwanted sync between them (loosen) or more needed sync (tighten).
- Write out a dependency diagram by going back to the slides and looking at what they did. Go by the criteria: A uses B only if A is simpler because it uses B and B is simpler because it doesn't need A. There is no useful subset containing A but not B. That means a legit dependency where A depends on B.
- Transform to a database schema as he did with concept-driven data models
- Implement the concept in software here is a TypeScript example
Imagine if you were a wandering software salesman who could meet clients and then right in front of them use all of the above methods on a piece of paper to completely design the features for the software they want. Making small state machines for the UI is exactly what Bonsai does or try Elm.
Version control
The prof of the MIT design course with a grad student created gitless.com see this research page. Read how they audited the conceptual design of Git and found things like staging were confusing. If you still want git resources then try MIT's version control lecture from it's course The Missing Semester of Your CS Education or read 'Git for Hackers.
Many companies today use a customized Mercurial fork or rewritten clone instead of git like Meta's rust written EdenFS and Sapling SCM because git was originally developed to take advantage of linux file system optimizations ergo is conceptually attached to that file system while Mercurial can be easily adapted to be distributed or run on any OS. In a Mercurial style of version control, you probably don't care about individual commits so you don't even add comments to commits you instead care about entire branch development. Here is the simple guide to using Mercurial as a lone developer.
OSS contributing
If you want to make a Pull Request or PR to an open source project hosted on Github this git workflow explains how it's properly done.
The unwritten rules for this are don't play code golf meaning messing with someone else's code for no other reason than to make it shorter or to change it to your preferred style. It's likely written that way for a good reason. Don't change any whitespaces. The proper way to redo someone else's code is to notice multiple features/functions can be combined into a less complex single feature or single function then you submit that PR (with tests). Be careful of the library scope you bring in too it should be fine grain library access some languages even let you restrict that library access to a few lines in a single function. Before you use a new library not already included in the project think about a year from now how many additional dependencies have been introduced to the project. Now some compilation has to carry all that code around for the install.
The PR diff should be as small as possible or they won't review it so break something large into smaller PRs where each is self contained and adds benefit they can clearly see. If you fix a bug include a regression test with it by finding where all the tests are kept (read the contrib docs). Properly benchmark whatever you change too to make sure you haven't screwed over the project reducing performance.
The GNU/FOSS way uses Savannah as a github GUI replacement for example here is a patch but all the work is done in plain text using a traditional mailing list style of attaching files and people vote/review it.
Freelancing locally
My recommendation is to be the local Zapier style developer and stitch together software people actually use instead of inventing an inferior SaaS product yourself like everyone else is doing. People are already using business software they prefer like Quickbooks for accounting, Zoho/Salesforce for CRM, or iCal/Google calendar for bookings. You now sew that all together into a custom product for them plus you are a local they can actually talk to and meet. If they like your work they will tell every other business owner they know.
Prime example is a centralized desktop that combines all 3rd party online ordering systems for a restaurant. If you walk into one today you will see multiple tablets/laptops all provided by different delivery companies and it looks ridiculous when the employees try and manage them. Doordash/Uber and the rest all have an API you can create a single dashboard and eliminate that row of tablets by the cash register they have to juggle. As the local Zapier/software glue freelancer you can also make sure all this order data gets sent to their CRM or accounting software too.
What to charge
There's a contractrates.fyi site to view project/hourly rates for freelancers though charge whatever you want at first then keep upping your daily rate, never charge hourly if it's possible. If you have too much work then your rate isn't high enough.
A common method of billing is for deliverables on a set schedule. You never want to just take off and spend months building software only to have the client freak out when you show them the finished product because they or you misunderstood the requirements. Always come up with some kind of regular scheme where you are billing in parts so take the entire project and slice it into something you charge weekly. If you're a web developer then adding authentication is a deliverable, adding a working catalog is a deliverable, etc.
Starting out
I tried a local experiment where the goal was to ask people about their business and what problems they were having to see if software could help. You just let others talk about themselves. I ended up with dozens of leads and if I was a software mercenary I would have picked up a lot of work. Unfortunately I'm not a software merc but kind of thinking I should be now that I've seen how easy it is. Everyone wants to work with someone they've personally met not a stranger on the internet.
I also called people out of the blue from various local companies and told them hey I'm trying to find out about your work tell me everything about it and they talked to me too which was not what I expected. This is taught by ycombinator's startup school.
Research
Here's what I found out by walking into places and meeting people. Every one of them had a problem with existing software they wanted to modify and they had never met anyone locally who could independently write software who wasn't some SaaS sales guy pushing an existing product.
Salons
An example using a nail salon. Their website points to Instagram and solely consists of a 3rd party hosted form that means they will have to phone or text/email whoever books to correct any overbookings. This can all be automated easily to show blocks of time that are previously reserved and sync some iCal protocol. Every one of these businesses rents out chairs to independent freelancers so they needed a fast way to add/remove new names to the booking calendar as these freelancers move around all the time. Deposit for appointment bookings they wanted too but nobody offers this which could be a simple Stripe integration. They wanted to offer a gift scheme where someone can pay for a service and give it away but needed a way to know if these credits were legit if they started selling dozens of them, another software problem.
Restaurants/Bars
Restaurants I found use at least 3-4 different software vendors. They all prefer handwritten order tickets then the wait staff manually use a restaurant management system with a touch screen to send the order to the kitchen. These are not consumer grade junk they have high-volume grade hardware. This kind of software would be impossible to compete with as tax authorities have to certify them to avoid classic fraud where the restaurant pockets the sales tax by generating an internal bill showing less sales tax then generating the real bill the customer receives. We don't have to compete with that software we only have to figure out how to interface with it and they all have APIs open for developers to use.
The second software they used was 3rd party table reservations which we can compete with. They absolutely hated every option because of ripoff fees like 10-20% 'service charge' being added on which customers mistakenly thought was the tip but it was the scam fee for the online booking service. Prepaid reservations reduced no shows and only 1 online service they knew of offered it but charged way too much. Yet another easy Stripe integration or whatever payment gateway they wish to use.
The other software was online orders/main website which usually just redirected to Uber or a similar gig service for online orders. As noted before the #1 request was to centralize all these 3rd party order sites into a single dashboard. Another request was some kind of dashboard for reputation management and a way to capture and control reviews meaning if you had a bad review you get directed to management to correct and if it was a good review you are redirected to google reviews or elsewhere. There are schemes for capturing these reviews such as emailing them a yes/no question about the experience and if they click yes redirect to a public review site and if no then redirect to contact the restaurant manager. I'm sure there's better techniques.
I was asked how to automate ticket sales for special events, adding merch sales, automate volumes on TVs showing sports games so the commercials were muted or music played, lighting automation to bring up the lighting during breaks in games, asking me if customized POS is available (Stripe Terminal) to capture signatures so they don't have to dig them out for disputes months later and many other problems this was a gold mine of potential freelance work I didn't expect.
Tailors
If you look at Huntsman suit tailors on Savile Row they have an interesting website where you can click Made to Order and customize almost everything. This feature was easy to write and I used an AI image generator to make the drawings of the clothing styles. I approached some tailors locally and they said this is exactly what they wanted plus some kind of zoom/facetime scheme for remote consultations.
Design examples
Let's look at a website award site. Here are some nominees we can mercilessly review using the conceptual design skills we just learned. They have examples of best design in shopping carts, booking pages, everything if you look around.
You can use DevTools in FireFox/Chrome to see responsive mode (a phone/tablet screen). Many, many sites have properly working phone screen css and totally broken desktop/laptop css.
- First nominee is https://by-kin.com/
The purpose of this site is a portfolio showcase for interior/exterior designers and the website itself was created by an agency so I'm reviewing the website not the business.
Intros are cancer but this one is short at least. You can click to dynamically change the layout (desktop view only) so a concept with no purpose. The drawings of staff look like wojaks. The 'About' page doesn't use a scroll bar or scroll concept indicating there is more to see, we'll see other sites do. The reel is laggy/broken on desktop I got a white box that expanded to fill up my screen and only noticed it had content when I went back to it after. This reel should be on the landing page instead of the wojaks or simply their portfolio on the landing page. There is a useless FAQ for each designer with some answers not finished and it's not even a relevant FAQ as I'm sure nobody is asking them what essential podcast we should be listening to.
Desktop view when you click on their portfolio of work you get an epilepsy triggering overly sensitive scroll that confusingly begins halfway through their portfolio and bombards you with changing images. Terrible concept. Responsive mode uses a totally different concept so 2 concepts, 1 purpose. Look at the description here: "Paying homage to the buildings past as a glass works. Many furniture elements, coffee tables etc feature different coloured and types of glass. Creating an eclectic mix of materials." whoever wrote that doesn't speak English and there are no pictures of different types of glass so I guess nobody at the website agency could be bothered to do any quality standards. Google reviews have much better pics of the full space that include the glass talked about in the description and most people rave about the design of this space in the reviews but none of that is shown in the portfolio.
There's a journal with no recent updates which tells me they had a limited contract with this developer and now that it's over nobody knows how to update the journal. This is the curse of all bespoke software and why most businesses prefer to simply have an Instagram or Facebook page because then at least they can update it themselves. A good developer (that's you) would make this a permanent feature and easy for them to upload. The LinkedIn link is broken and I don't think these guys even have a group LinkedIn they are a collaboration of different freelance designers, another mistake. The contact page should be some kind of form for directing the communication and a phone number as I never trust any business that doesn't have one.
- Second nominee https://unium.jp/
The purpose of this site is a freelance web designer showcasing a portfolio.
Another site where the desktop version is broken, here it is missing the color highlighting on the logo and text that the mobile version has. The scroll circle concept on mobile is broken it shows you've fully scrolled after the first page but there's multiple more scrolls left as you end up jumping to every other page. The menu is now a useless concept if you're just going to scroll through the whole site. Desktop view if you click on service the case study hijacks the pointer with this gigantic floating box preview which is awful. The contact page is amusing: 'Contact us for crime prevention service' wait, what? I can summon Batman? No mention of cyber security in the service section. There's terms and conditions you have to agree to before submitting the contact form which is strange but maybe law in Japan. Their website design work in the portfolio is pretty good I would have made that the focus of the site and eliminated all the eye searing infinity scrolling animations and pointer hijacking garbage.
They are recruiting so if you're in Japan do a complete conceptual design analysis of this site and offer to fix it if they hire you.
- Third nominee https://monolith.nyc/
The purpose of this site is a trade catalog for bulk orders by architects and designers and some agency built their website.
The desktop view is guilty of the worst internet crime which is a scroll that keeps repeating itself for infinity whereas the phone view is nicely done and we finally get a scroll bar, wow. I gave up reviewing the desktop version it's totally unusable and broken everywhere. The most critical part of the site 'About Monolith' is only accessible by scrolling the front page and is not in the menu despite the title 'Site links' so we have another menu concept at the top of the page with no purpose. 'Monolith Trade' oddly redirects to a 3rd party form that only asks for an email, not sure why it exists with the contact email beside it. If you want to capture emails for mailchimp style marketing you don't need this $50/month form.
Almost every site reviewed so far their desktop versions have this awful trend of mirroring the pointer with a very slow animation making the site seem sluggish when it's not. Ditch that pointer shadow junk.
Review the Reviewers
Members of the award site can vote on and rate other sites. Let's review the reviewers to find someone who is actually honest as they seem to give every site too high a score in hopes when they post their own websites for nomination that they are returned the favor. The ratings for the Monolith site there is only one honest review with everyone else giving this a 8+/10 except for this Bulgarian developer. Looking at her site it's pretty good for one there's a real scroll bar and everything has a purpose as this is a mix of a personal and business site which I would never mix but whatever. She clearly lays out the development process in the FAQ which I would promote to the front page and is an actual FAQ unlike the other site we reviewed earlier. The desktop view is not broken, a first!
The only other reviewer I've found so far with a website of their own who isn't ass kissing every entry is this Russian guy. I am again shocked the desktop view actually works, and there's even a scroll bar. His site does only what it needs to do which is show off technical skill adding animations, show off the agency portfolio and present contacts to harvest leads. I looked at one of his clients some Russian medical supply company and there's a well done concept for displaying those highly annoying chatbots that float at the bottom of every website these days.
Design examples II
Let's look at the CSS Design Awards.
Warning! Some of these sites here like this bespoke watchmaker are foolishly using TrustPilot widgets when your policy should be to ignore that site completely. Let's imagine I run a review site. I add your service without you knowing then I can leave some bad reviews even though I've never used your service. I contact you and say 'hey there's some bad reviews here of your business'. You want to comment on these reviews to point out they are fake but to do so you have to agree to let me use all your logos and branding. Now I have an official looking page with all your graphics on it licensed for free, forever. Thanks!
- First nominee is https://www.bottega53.com/
The purpose of this website is a portfolio for a photography biz and some agency created this website.
The intro finally has a real purpose! It sets up the portfolio and displays that before anything else. The desktop view cookie and privacy box is non-intrusive and well designed instead of those awful ones that take up half the screen. The scroll concept on the mobile view is well done and the desktop view has a real scroll bar. When you click on a portfolio entry the concept they use to see more photos tells you the amount which was taught in the MIT course about adding information bits to the design. Everything here has a clear purpose. The contact form is actually useful. The animations are useful and not overused, you see one when activating the portfolio filter it rotates to open and then rotates back to closed. Finally a good website.
- The agency that designed this website is here.
Let's review them too since we could also be an agency one day. They are going to heavily use animation to show off skills of course but not everything needs to be spinning they overdo some of it. Their portfolio is the front page as it should be but on desktop view it's broken the pointer disappears and there's no info crumbs to tell you to drag everything sideways. Desktop view has a tiny music player with no purpose other than to play some extremely amusing cyber doom techno from out of nowhere that doesn't match their portfolio or the playful tone of the website at all. Some of the desktop view fonts are microscopic but look fine on a phone.
Found a conceptual design misfit, if you click contact in the menu you don't get the contact form like you do if you click the many 'lets collab' animations or by scrolling to the bottom of the front page. 2 different contact concepts with the same purpose. The form also demands you enter a category without saying what the categories are. That's something conceptual design would have definitely caught and you think it's obvious but apparently even some of the premiere designers screw it up.
Opportunity!
These website award sites are filled with freelancers and agencies most of them front end designers. You know how to properly design software and can build it from scratch. They can make it come to life with css and animations. Why not contact some of these people and show them your software skill portfolio?
If you need inexpensive or free hobby hosting then look at the deployments for Neon which is a free tier serverless PostgreSQL dbms. If you need a domain then use Porkbun it comes with a Let's Encrypt SSL cert. You can design desktop dashboards or phone apps too why restrict yourself to only web apps. Most commmand HQ style dashboards run in a browser locally and still need css design.
Try fly.io and set traffic limits it will remain free to use as a hobby/resume/project site just to advertise your skills. They are 'serverless' and the documentation is well done for Node, Elixir/Phoenix, Laravel and other web tech.
Marketplace case study
Let's see what's going on here at the Shopify app marketplace.
Forms are a major problem as Shopify refuses to fix their own form offerings so you have to pay some 3rd party. There is a total shit show of inept offerings except for Hulk Form Builder who is the most popular it seems. No surprise why they are popular they offer a premium onboarding and migration service to install the form by booking a phone call. Remember the ycombinator B2B advice of phoning your customers.
Looking at their website, they are owned by someone else. We found the final boss of the monopoly on shopify apps it's this company which even offers to buy your app. You could make a startup by finding an app/ability they don't have listed here and monopolizing that niche to get them to buy it. They have some affiliate program where developers can tout any app they own and make shill bux too.
Let's review this app it's recent so we can judge how to start one of these. It's concept is to add a progress bar for free shipping/rewards a classic sales driving tactic. The description for this app uses way too much jargon like 'Get ready for BFCM' which isn't defined. Looking at the reviews of course the biggest problem once again is not offering to onboard/install. One review said this app causes a lot of debug spam and breaks some product pages and is a good reminder of effects your software can have that are unintended. A review from a store called Fuffies is using it and laments the app is too slow to reflect changes though it seems the guy developing the app manually fixed the problem which again would have been solved by offering installation. Looking at the Fuffies shopping cart to see the progress bar in action I found an issue there should be some kind of threshold/rounding config available for example if you buy 2 of her stuffed piggus you are $0.02 short from getting free shipping. Maybe the progress bar concept for free shipping shouldn't be in prices but allow for number of products instead. For her store she could have a picture of an empty box in the checkout then when a stuffed crab is added to the cart it's placed in the box. Buy a stuffed piggu and the box is full.
Marketplace strategy
Let's say we want to sell an app using the shopify marketplace.
The easiest way to start would be to simply talk to every existing shopify store owner you can find and learn about their business to discover ways software in that marketplace can help them.
If whatever you decide to make has competitors look at their pricing schemes. You don't want to undercut their pricing you want to match their most expensive pricing but justify it through superior product and service. We are in the B2B software game it's not like selling shoes where you can just discount the price because these companies will pay premium if you offer a premium solution.
While you are looking at competitors write down their existing features and go through their reviews writing down what every wished for feature was. You don't implement all these features you do conceptual design which is to arrange all the similar features together and think of some concept that includes every one of them. Write down everything they dislike too which is going to be 80% install glitches that require manual intervention and imprecise estimates for support replies.
Whatever you offer should be some kind of premium white glove service and the best solution is a booked phone call where you can fully integrate your app with their design because if you don't it will become a support problem anyway. If you are talking to the owner which you likely will then you have yet another opportunity to ask them about their business. You don't want to rush through the install panicking that's not how B2B works you build relationships which pay off over time. By talking to them directly while you onboard/install your app you are actually being paid to interview them and use the intel you gain to find new features.
If you grow then start hiring account managers but continue to talk to customers at regular intervals that's how you keep subscriptions and your product growing because they will tell you new things that lead to new features. Where I work there is a fleet of account executives and their sole job is to contact the buyers of our specialty software and maintain a relationship.
For deciding what to make you can use the same conceptual design analysis we learned in the MIT course take all the available apps and arrange them by concept seeing if any of them have overlapping purposes. There's one app you can combine together.
Startups
A real startup requires venture capital. Here's Peter Thiel giving a very good crash course in making a startup to Stanford students. Start small and monopolize something small. Here's an old article of Sam Altman of Open AI (now a monopoly too) talking about how Y Combinator's success is due to it being … a monopoly.
As mentioned before as a founder all you do is talk to people in the market you are trying to monopolize because you'll be able to spot opportunities where software is useful enough to them they will start paying you for it.
Building Software
Here is some recent advice from antirez a hacker from Sicily who created Redis (now an OSS disaster, see below) on how you get good at building software:
- 1. Learn algorithms, buy some book and start reading.
- 2. Learn theory of neural networks, use the Chollet book to develop some knowledge and intuition.
- 3. Write many small "pet" programs implementing basic stuff: implement a small database, a small programming language interpreter, a small editor, a small neural network, … Each time try to apply good design.
- 4. Embrace simplicity in everything you write, don't make things more complex than needed.
- 5. Read good quality code, especially read open source code which is at a degree of complexity that makes reading valuable. Dont' read Kubernets… or PostgreSQL perhaps. Learn more self-contained code bases.
- 6. Participate to some OSS project.
- 7. Start some side-project and put it on GitHub, where you are the main designer. Develop something that you need. A library, or a small utility, something that you really enojoy doing. Do it at a quality level that makes you happy. Never regret pushing code on GitHub if you feel that for the level you are right now it is appropriate.
- 8. Don't give a fck about what other programmers think of your work, if you did it at the max level of what you can do. Anyway most programs on the Internet suck, including the ones of people feeling very competent.
As for Redis he sold all rights to the software years ago and that new company went private in 2024 taking control over all the libraries and clients to lease it to Microsoft or something, I don't care at all. The point is the BSD license permits this to happen so if you make something you intend to be free forever then use whatever latest FSF/GNU license and if you intend to cash out or allow Amazon and Microsoft to steal your code for free use something else like the BSD license.
Now we take his advice and build a modern application from scratch in whatever language you want.
Course Overview 15-721
This advanced course doesn't teach SQL/relational dbms it teaches modern distributed system design.
Watching lecture #00 from CMU's 15-721.
He lists the reasons why we should take this course and we are taking it for the second reason which is if we are good enough to write code for an online analytical system then we can write code for anything else that cares about performance. Most of the second half of the lecture is course specific logistics we don't care about. We will have to learn about operating systems and the CPU execution architecture which we'll do as it comes up.
If you look at the projects students had to build from scratch some part of a modern OLAP system like the scheduler, execution engine, I/O etc.
GlareDB
Every year CMU does a database seminar with the lectures uploaded to YouTube and there's a very good one by GlareDB how they built a product using Datafusion as their execution engine then quickly found out after experiencing dependency management hell they needed to rewrite it all from scratch. The video is worth watching since this is what we're doing but of course on a much smaller scale. The work in progress code is here written in Rust, look at some of the crates for parsing sql for example as inspiration.
Course Overview 15-445
The advanced course teaches distributed application development where performance is key and his relational course teaches system application development where local performance is key. If you've done any kind of system application development you quickly realize all you are doing is adding a thin layer on top of MySQL or Postgres. Now we even have omnigres or Postgres as a Platform. I'm also interested in research to replace React with some kind of reactive dbms running client side and rewriting tools like OSquery.
I'll use this course to build a small relational dbms from scratch. You'll see many of these custom relational dbms' posted to Hacker News written in Go, or running on .NET or the JVM and how they worked around the memory garbage collector. The point here is to learn so whatever meme language you want to use is totally fine. Here is a relational dbms in 250 lines of lisp.
Watching lecture #00 from 15-445 @6:43 he says non-CMU students can complete all assignments using Gradescope and even hands out a code we can use if you're interested. There's a public discord channel too. The assignments are in C++ and their C++23 bootcamp is pretty good. BusTub you have to read existing code and write features so it mimics what you'd do in open source development or a job. Majority of this lecture you can skip it's all logistics after the intro.
Modern Analytical Database Systems
Watching lecture #01 from 15-721 explaining what a modern OLAP system is.
The first paper assigned is by Databricks where they shill for standardized, open data storage formats like Parquet which is taught in the next lecture I believe. All these terms like 'Lakehouse' are just marketing but means computation is done near the data. The second paper is written by Facebook developers and advocates that the architecture of OLAP systems should be open source modules working together instead of reinventing the wheel with every new database system as there's now dozens of startups causing fragmentation.
Materialized views are precomputed queries like sql aggregations (sum, max, avg) that have been cached so you don't have to run the query again. S3 is referring to Amazon S3 or 'simple storage service' which is a massive cloud for storing immutable data in any format like CSV, JSON or Apache Parquet format. These are organized into different global regions or 'buckets' like the aws-cn bucket is the Chinese region s3 data pool. Salesforce has 100+ Petabytes on s3 that they do analytics on.
@30:58 the architecture overview breaks everything up into 6 parts and we will learn all 6 in this course with a focus on the query optimizer as he says it's the hardest to build. @53m POSIX API means your operating system API which are syscalls like reading/writing files to a virtual file system. POSIX is supposed to be a standard to maintain compatibility between operating systems but I don't even think Linux is POSIX certified so you still have to do platform testing anyway. At the end he talks about how Yellowbrick did some fintech tricks to speed up fetching s3 data.
We can start writing software after the next 2 lectures when he teaches us how to encode and compress data.
Building Hardware
At the same time we are doing Building Software we should learn how modern hardware works such as the CPU execution architecture. There is a paradigm shift going on in all industry right now where everyone is building their own custom architecture.
Today's hardware has serious problems as per this grad course:
CPUs
- Adding more CPU cores is useless as the primary bottleneck is memory/storage
- The cores themselves are broken due to 'silent data corruption'
- Logic gates and interconnects are too small operating at too low voltages
- Nobody knows why this is happening (high temp? silicon defects??)
- Defensive programming against the hardware doing testing for data corruption is now a thing (FPGA you'll have to write)
DDRx memory
Rowhammer was originally a tactic to read/close DRAM memory repeatedly like you were pounding it with a hammer which triggered charge leakage to adjacent memory. Bits got flipped and you could break out of virtual memory pages. This problem has only become worse since it was discovered and now similar attacks can be done with WebGL, remote over a network, attacking a VM host and all it's guests, and the mitigations so far don't work.
- DRAM scaling can't continue due to rowhammer style attacks (memory read disturbances)
- The more recent a DRAM chip is made the less reliable against read disturbances
- Periodic refresh has been lowered by mfgs to avoid performance overhead and enables these attacks even more
- First generation read disturbances could only affect adjacent n+1 or n-1 rows now can access many rows
- DDR5 mitigations enabled new DoS attacks, performance problems
- The mitigations don't even work as they rely on observing high row activation count but now we have low activation attacks invisible to countering
- The latest read disturbance attacks are not even rowhammer in nature and affect different rows/cells with an unknown underlying error mechanism only physics can explain
- Memory controllers are not intelligent and need to be rewritten from scratch (that's you writing a FPGA)
- Network cards where DMA is exploited (as taught in 15-721) are open to remote rowhammer style attacks (another FPGA you may be writing)
Flash Memory
- The charge leaks in flash memory too as they're also now so small everything interferes
- High retention errors even with <1 year flash memory compared to SSDs/NAND flash years ago
- Flash memory controllers are intelligent and can remap data to prevent data degradation but very few controllers do this (yet another FPGA you'll have to write)
Digital Design and Computer Architecture (DDCA)
There is an excellent undergrad ETH Zurich course here that is fully open and doesn't require a physics background. It focuses on modern and future hardware, I guarantee you will like this course it's not like any other architecture courses I've seen.
Casually watching the YouTube lectures you're interested in and reading some of papers is enough but there is also an opportunity for us to try some FPGA programming with the labs. Vivado software is used however you can also use OCaml to run the same simulations since Vivado is a ridiculously large download (60g!!).
TODO
Job Interviews
This is an accurate summary of what we'll be doing.
We are going to use CodinGame (free, 25 languages). It's designed so you learn as you go and Coderpad is likely the interview software they'll ask you to use (Apple, Jane Street, Nasdaq, Shopify, Snowflake) and many interviewers at companies are lazy so they will reach into the bin of premade interview tasks which are designed by the same people who make CodinGame.
The USACO Guide (free, any language) solution writeups to competition problems are a master class in algorithm analysis and the level of difficulty there is very similar to on-site interviews where they purposely give you something that seems impossible to solve just to see your logic process. A competitive programmer needs to know about strategies to solve problems so why not learn from the pros.
Languages
CodinGame supports Haskell, OCaml, F#, Rust, Scala, JS/TypeScript, C#, Lua, Swift, Python, C/C++, Java, Clojure, Bash and some more. USACO problems you can use any language.
- Lua is probably the simplest to get started since it's already used for game modding and everywhere else for wrangling configuration files.
- Python resources are everywhere like this CMU 15-112 schedule. We also took Python in the accelerated intro to CS book which explains the weird scope of Python3.
- OCaml you can learn here or here with modified libraries.
- Haskell you can learn here with full vids/book explaining category theory.
- To learn C there is Modern C and IYMLC.
- To learn C++23 try the CMU bootcamp or NVIDIA slides.
- To learn Rust take the Brown University experimental Rust book.
- TypeScript software engineering is taught by MIT here.
- Java versions here.
- or just read the documentation of w/e language you chose
We can explain the language we selected if we read the chapters on SMoL or the Standard Model of Languages from the work book PLAI (plai.org).
What we want to learn
We really only care about problem solving strategies and the standard design techniques. We'll see some data structures like tries and purely functional arrays with log access time but for most problems whatever language you chose has every structure or sorting algorithm you need documented in it's standard library:
- Brute Force
- Throw every computational resource at a problem to solve it like generating all elements in the problem domain and using exhaustive search
- Exhaustive Search
- Look at everything and find a solution (depth/breadth first)
- If problem instance too large then construct partial solutions (state-space tree) and evaluate if a solution is still feasible (backtracking)
- Decrease & Conquer
- Reduce to a smaller instance of the problem that helps you solve the entire problem
- Divide & Conquer
- Split into several subproblems and solve them
- Transform & Conquer
- Modify the problem with a different representation
- Reduce the dimension or cast it to a richer dimension with more information
- Prestructuring
- Preprocess the input with some enhancement like indexing/dictionaries
- Many graph algorithms you do some kind of linear cleanup to remove cycles on the input like multiple rounds of Boruvka before constructing an MST using Kruskal.
- Dynamic Programming
- An optimal solution to the entire problem instance is composed of optimal solutions to subinstances
- Greedy Technique
- Always make the locally optimal choice (Shortest Path)
- Iterative Improvements
- Improve optimal solution with repeated applications of a simple step (Max Flow)
If you practice the above you will never need to grind leetcode medium and hope you've seen the problem before in an interview because you can solve any problem. USACO has even more like teaching how to simulate the problem.