Met in the real world. Computers were bulky.
3rd Generation (Early Gen X)
4th Generation (Late Gen X)
Google – Orkut / Buzz / Talk
5th Generation (Early Millenial)
6th Generation (Late Millenial / Gen Z)
7th Generation (Gen Z)
Know for practicality, presence of goto, 1-indexed arrays but mostly being useful for beginners. Dominate the industry but always seem to fall from grace because of crazy syntax and letting beginners abuse them in live code.
a e s t h e t i c s
Bondage and Discipline family / Algol Family
Known for imposing discipline, having unreadable standards and instilling fear of the compiler. All these imposing languages have toxic, sick, stubborn and obsessive compulsive members who dream of being knighted by Dijkstra – peace be upon him – in heaven after they have won the holy war against everyone else.
Pro Tip: Easiest way to cause their meltdown is to say that array indexing must begin with 1, like everyday mathematics. Remind them that no one can implement the standards correctly and more importantly, that 99% of the sane programmers don’t fucking care about their boring scribbles.
Turtles all the way down family
These languages sacrifice virgins at the altar of purity. Use the word homo a lot, while trying to be iconic.
Do what you want family
These languages are just happy to be of service. Solve real problems but also talk less. Most apolitical languages around.
but everyone just uses HTML these days.
Please use me languages
These languages promise to be your new quirky best friend.
I was your favourite once languages
you haven’t forgotten them, have you ?
Here are some of the well know examples for this style
1. Simula 1 – It used co-routines (called activities) and queues to model long running simulations. Simula 67 replaced activities with classes among other things.
2. Unix – Has pipes and daemons to model data transformations and periodically recurring jobs
3. Microservices / REST / CGI / mod_php – uses long running services to model distributed business processes
4. Actor Model – Uses light weight threads organised in supervisor trees to model reliable software
5. Entity Systems – Uses a shared memory, relational database approach to model data called entities, that are then efficiently processed by long running processes called systems that run for every game tick
6. Messaging Systems – Typically uses long running processes to decouple complex systems
7. Stream Processing – Typically uses long running processes to serve large binary data for videos or event streams for example
8. State Machines – Most well known use is in modelling internet protocols with polling, asynchronous events and long running event loops.
Reductionism leads to endless splitting and an over emphasis on 1 dimensional analysis. I don’t like holism either – it is too paralysing and preachy. So I am coining the term exploratory holism. I think it captures the best of both.
What I absolutely love about fossil
1. No more git push origin master
2. Simpler command line
3. Basic ticket system + Captcha
4. User management
5. Single file and a common repos folder
What I don’t like
1. I don’t want wiki, forums or chat
2. No git rebase
3. Can’t purge wiki pages
Not sure if fossil has commit hooks and how easy it is to customise the theme.
mkdir repos fossil server --https --repolist repos fossil init # creates a new admin user with a fresh password, note it down somewhere fossil open fossil clone or fossil open https://$user:$email@example.com/<project> mkdir .fossil-settings gvim .fossil-settings/ignore-glob fossil add . fossil commit fossil timeline fossil sync
Branch / Merge
fossil branch test or fossil commit --private fossil merge --cherrypick $commit1 fossil merge --cherrypick $commit2 ... fossil commit
$commit-id is the id from which you want to remove.
fossil amend $commit-id --branch BOGUS --hide fossil update $previous-to-commit-id fossil purge checkins BOGUS fossil sync
Use fossil diff instead of rebase.
Edit empty page to delete wiki
The advantage of 1D text interfaces is – it allows you to write loops easily, which allows for automation. Text also makes it easier to load predefined configurations. It is a simpler programming model, making it easy to extend. With UI however you get
1. Better ways of finding of all the operations, increases chunking
2. Don’t have to memorise when the UI can suggest
3. Text selections are difficult to do with sed
4. Live Validation
5. Drag and drop and touch are how many real world objects work
Next demo song will be low fi or chiptune with a sample browser.
It seems we are already evolving to a new man-machine hybrid and techno spirituality. Journalism, Politics, Economics will be more data driven. Can radical transparency solve the ills of capitalism and government ?
Education will be dead as we know it. Will we do away with the outdated copyright models and free knowledge ?
Engineering will become more open, radical and small – IOT, 3D Printing, Open Hardware. Bioengineering, geological engineering and clean technology will be the next frontiers.
Will natural language interfaces and visual coding be the next paradigm shifts in programming ? This decade wasm will become mainstream.
Guess and check 1
Model – Solve a simpler problem. In chess you reduce a complex problem to a simple end game 2
If you can’t find a solution, try assuming that you have a solution and seeing what you can derive from that – work backward 3
Use symmetry 3
Use direct reasoning, Consider special cases 4
Eliminate possibilities 5
If you are having difficulty understanding a problem, try drawing a picture. If the problem is abstract, try examining a concrete example.
Try solving a more general problem first inventor’s paradox: the more ambitious plan may have more chances of success
Apply a similar heuristic
- Be positive. Take help, learn from history. Some problems are intractable.
“Do not spoil what you have by desiring what you have not; remember that what you now have was once among the things you only hoped for.” ~ Epicurus
1. Mundane / Habitual work
2. Work requiring other peoples input
4. Trying to impress others
Any complex tasks is a series of small tasks. Divide a complex task into simple tasks to get started.
Time and Energy are like budgets
45 – 90 mins max concentration after that you experience a burnout. Only work in short busts of productivity and mentally practice before working. Start day with todo
Divide work into longer timespan with small chunks everyday. Process > Goals
Parallelize around blockers
Batching – Combine boring tasks
Best ideas come in seconds or minutes. Let your brain work in the background. No way you can force it if it a serious problem
Bad ideas lead to good ideas. Give yourself permission to write garbage. Taste hinders you
Do other things … one thing can inspire another thing
Make it fun follow the fun. Think about beating your previous record
Think of the impact for motivation
Multiple rehearsals to get 1 final presentation right. A task needs to be done atleast 5 times to get it right – outline, draft, revision, feedback, final
This is how cars are manufactured today.
In software the replication cost is zero unlike hardware where you need thousands of people to assemble parts. Software is a discovery driven field unlike an assembly line, although managers insist on the assembly line. It seems with the release of Github Co-pilot we have entered a similar era in programming. Will retro programming be a thing in the future like retro car building ?
Assuming a robot can replace 10 people cost-effectively it will add 4 new jobs while taking away 10 jobs. The new 4 jobs would be
1. Supervising the robot
2. Hardware Maintenance / Repair
4. Data maintenance, AI maintenance
The jobs like marketing, management, accounting … will be similar to the jobs held in the previous technology. The training cost for teaching people familiar with the old technology, the new cool thing will be significant not to mention the environmental cost. Aesthetically speaking old technology has a charm but new technology is just too cheaper to ignore. Case in point, AWS with its dynamic IP address effectively replaced the hardware load balancer and created a new dev ops field as a result.
Magazines – Blogs
Radio – Podcasts
Gossip – Forums
Reviews – Comment Sections
Telephone – WhatsApp
Yellow Pages – Google / Amazon
TV, Home Videos – Youtube
Cinema – Netflix
News – Newsletters
Post – Email
Academic Journals – arxiv
Printing press – Documents
Telephone Orders – E-commerce
Phone networking – Crowd Funding, Event Management
Training Videos – Coursera
Communication requires a medium – oral, book, cinema, radio, tv, newspaper and magazines. Computers provide poor dpi, resolution, bitrates compared to analog. While previous mediums are 1-1 and 1-n, computers with internet enable m-n with sync and async modes. Bad quality content happens for large m and large n. When m is small and n is large, it resembles TV with all its faults of propagating uncritical mythos. Cost for consumption increases as m increases. Cost for creation increases as n increases.
Internet is an unregulated medium and it is content agnostic – text, images, video, sound. Like Pirate Radio, m and n can be small – this is the most unique possibility with the internet. Now internet is a new medium but academic publishing is old, they have an important connection though. It’s the hyperlink or the reference. Unlike all else, the property of this medium is permanent memory. All other mediums rely on people forgetting stuff, after the communication is over. In the internet not so much! You are expected to google and dig deep into the hyperlinks. In an academic journal, you are expected to read the footnotes. This makes internet communication one way to record and to preserve cat pictures, truth, facts and arguments although they can be easily distorted if we are not careful.
For consumers and creators the easy way to use internet is to treat it like an extension to tv, news, magazines, yellow pages and find niche communities. While there is negative employment for middlemen, computers provide new forms of employment – designers, programmers, hosting companies, crooks. For knowledge workers it provides new ways of dissemination – marketers, teachers, journalists, scientists and finally computers provide new venues and collaboration spaces for entertainers, hobbyists.
The literate source code written using wheel.
This is probably the first web app written using literate programming.
You get docker like capabilities and isolation but with the feel of using a normal dev environment. Easy snapshots makes taking backups a breeze.
Unix Supported Paradigms
1. Event driven programming
2. Asynchronous programming
3. Data Flow – pipes
4. Parallel programming – fork, threads
5. Exceptions – signals
6. Modular programming – dlopen, plugins via dlls
7. Message Oriented Programming – sockets
1. Generic Programming – void* , preprocessor, varargs
2. Generative / Macro programming – preprocessor, lex-yacc, autogen, gsl, gpp, m4 which generate C code
3. Object oriented programming – custom vtables which favours composition over inheritance, also see this, gobject and enlightenment support mixins as well … not to mention other techniques like decision tables
4. Automata programming – gotos and arrays of labels, SMC
5. Stack programming ~ inline assembly
6. Functional programming – function pointers and libcello, tagged unions, coroutines
1. Actor model ~ zeromq + supervisor
2. Literate programming – noweb
3. Logic programming – Databases
4. Garbage collection – use gcc builtin defer and external garbage collector
5. Array programming – C memory model, numpy
6. Audio programming – LV2, openal, puredata
7. Graphics programming – opengl
8. Differential programming
While C++, Java, Objective-C may claim to be descendants of C they really are more like PL/I and multics in spirit because of too much centralised planning and perfectionism; techniques which have persistently been shown to be disasters is software projects. Why C ? Well …
1. The other communities have shown a profound lack of integrity and sleazy sales tactics (vague promises, fud, us vs them, eee) in their marketing. The adoption was forced on programmers in a top down way by non-programmers and licenses than by voluntary adoption by teams or natural market competition. They also setup a false dichotomy and rhetorical gimmicks of high level vs low level, strong vs weak as opposed to broad vs narrow.
2. Other languages are complex, difficult to explain to beginners and encourage pedantic, patronising thinking. They also copy the worst traits of mathematics – namely abstraction for abstraction’s sake and bad naming conventions. Like physics, chemistry programming deals in concretions. Like electronics it is better for programming to be bottom up.
3. Other communities are obsessed with superficial and subjective arguments – code cleanliness, code purity as opposed to code reliability. They merely look modern, but they are not modern in the sense of empirical and science but aesthetics. None of the languages have come close to implementing a server like apache or the tcp/ip stack. The benchmarks compare apples to oranges in sweetness and in the case of C++ inline functions to function call overhead.
4. Completely failed predictions … 0 modern operating systems are written in C++ and Java. Their success lies in using XML based guis which you can also do in C. Blender is written in C.
5. Better programmer happiness. More hobbyists pick C than any other language. Large open source codebase.
6. Code longevity, portability and less API/ABI breakage
7. Mono-thinking cultures are simplistic and inherently less creative, less innovative while suffering from philosophical hammers.
8. C and programming languages written in C dominate the web, embedded space and performance metrics while others are slow. If you are looking for performant web servers checkout – lwan, kore, open resty, onion
9. Extremely rich tooling and cross platform support.
What can C programmers improve ?
1. Better naming conventions
2. Use garbage collection for non critical tasks
3. Use namespaces and nested functions
4. Better security with bounds checking and garbage collection
Much like how exercise easily fatigues the muscles, too much focus or flow drains the working memory. It is critical to take breaks every 10 minutes to regain balance otherwise while the first day might be productive the next few days will not be.
If a task is already done the estimate is 0!
My biggest regret in my programming career is not sticking to just C. I should have avoided OO / FP and all the framework bullshit that promise everything and deliver shambles. If you are a beginning programmer don’t waste time in any of that, develop knowledge about applications, databases, operating systems and games. C + Lua should be enough.
To date C is the only language with which you can have a complete stack
2. CLI / GUI Apps
4. Games (all 8bit, 16bit games)
5. Embedded controllers
without a single line of any other language. Assembly too is wonderful! And because assembly instructions have a fixed format, it too is easy to parse – just like Lisp.
Myth – C can only be used in small teams.
Reality – Linux Kernel, FFmpeg …
Myth – C doesn’t have OO so it is not an “industrial” language.
Reality – C doesn’t force you to use objects for everything. You can do composition style OO trivially in C and there are multiple options to choose from. Blender, Gimp are complex GUI apps written in C not to mention Tk. C offers shared libraries aka modules which allows you to decompose teams along those lines.
Myth – C is not functional.
Reality – C has co-routines, const, pointers and function pointers which gives you all the advantages without abstract nonsense.
Myth – C is not secure.
Reality – Somewhat true. C programmers refuse mandatory bounds checking, secure libraries and gc but this can be fixed.
Black and White thinking
This style of thinking is nothing short of delusional. The open source community has too much of this and too little pragmatism. The split between free software and open source happened because of this reason and we have been paying for it, ever since. Much like the creative commons community, FOSS could have settled on multiple styles of licenses.
Not anticipating tivo, cloud
Unix is a timesharing system used in routers everywhere. Not anticipating patents, tivo and cloud from the day one is nothing short of embarrassing.
FOSS can not exist in isolation. Firefox and Ubuntu both failed in mobile. Corporations have successfully screwed over FOSS by locking them up in hardware; which is clearly anti competitive and monopolistic. Instead of having general hardware and consumer choice for software we have the opposite. The open source world has never really addressed this issue nor did it forge broader alliance with the open hardware and other open movements.
Open Source as a certification
Instead of having legal requirements for a business entity to call itself “open source” any corporation can pretend to be open source now, when they are in-fact mixed source. This is a drastic failure. No only could such a legal requirement be profitable for the certifying authority, it would also increase consumer visibility and trust. Now many consumers think they are buying open source when they are just using mixed source products.
Allowing the press to win the GNU / Linux naming battle which was a smear campaign in disguise. Also the usage of the word hacker in media. Being identified with communism and not with indie movement seen in music and elsewhere. The FSF has taken a half assed approach to this instead of using all legal measures to fight the press. No one really knows where FOSS stands. Every sane minded person should be vary of communism and M$ easily played on this fear in the 90s. On a side note, software is not a scarce commodity.
Appropriating funds and time for vanity projects and trifles like Firefox vs IceWeasel
The FSF has diverted more than enough funds on vanity projects like GNU Hurd. Early in the 1990s, Scheme was chosen as the language for scripting FSF projects on the insistence of Richard Stallman. Even now a number of major projects like GIMP are forced to use scheme. You can’t have compulsion and free in the same sentence. It is deeply hypocritical for FSF to dictate language choice just as it is immoral for a business entity to dictate how you should use your phone. The reasoning is here is nothing short of tyrannical. PHP has done more for free software than Lisp. The goal of FSF should be broader, safer choice in consumer software as opposed to any constraints and pointless forks. Customer support, user happiness, developer happiness, safety, transparency and ease of use are more important than crazy architectures and mere openness.
Why scheme ? Why not vala ?
Not building a business model around complements
This is also applicable for the *BSDs. Could FSF have funded itself by offering hosting solutions like digital ocean, selling books and hardware like Amazon, source management like gitlab and so on ? Instead of the D.I.Y attitude FOSS community relies on begging. Instead on yapping on and on about “free” and “open” software money could have the done all the talking. This is how profitable independent labels operate in the music world. Linux could have had an AppStore long ago with payment integrations, issue tracking and what not! Most open source projects don’t even collect email addresses of people who download and use their software. Only paid users getting priority ticket fixes could easily solve open source developer burnout.
Allowing redistribution and commercial use
The biggest achilles heel of open source is allowing redistribution of software as opposed to merely source available software available for private use. There are too many freeloaders on open source. It is also deeply unethical for someone else to make money out of your free contributions. Plenty of open source contributors are screwed over here when project owners get investor funding and contributors don’t see any of it. Github also did this cleverly by associating itself with words like open and community but never really had open source. This is nothing short of fraudulent. Open source developers need to understand contributor agreements before they commit a good chunk of time to work on open source. Money flows need to be transparent in open source.
1. Quit smoking
2. Cut down on coffee
3. Invested in back support, neck support and wrist support
4. Using vitamin D supplements, L-Theamine for anxiety and detox
5. Exercise for 10 minutes everyday
7. Quit twitter, netflix, HN, reddit, news after being addicted to them for 6 months of doom scrolling.
I guess I am finally old.
1. Nixos, Unikernels, Docker
2. CSS from scratch – tailwind, basscss, button shadows
3. vdom, svelte, pjax, websockets, caddy
4. ActorDB vs Rqlite vs Couchbase vs Custom Sqlite / JSON store
5. Wrote a blog engine in hylang, go, crystal, perl6
6. Moving away from google – WordPress, Goat Tracker, maddy mail server
7. Learnt a bit about Ethereum
8. Completed three projects
Also learnt more about mixing and remastered all my old songs.
1. Quit day dreaming
2. Better emotion management
3. Use RSS for everything
4. Reduce media consumption even more
More future learning
2. Better writing
Regrets – should have bought some Ethereum!
1. Programming deals with perfection more than any other discipline, what is not perfect does not work
2. We are not paid to use every feature of the language, we are paid to write programs that work well and are free of errors
3. You should not take unnecessary risks to write code
4. Responsibility hierarchy … user > developer > manager
5. Time taken to type the code is not a good way to estimate. Time taken to make code work right can be very long
(Bad) Arguments against good parts
1. It is not a matter of opinion if there is economic cost in terms of errors and delays
2. Reduce my keystrokes is not a good argument (programming is not typing)
3. It is an insult to suggest that I would ever make a mistake (thats silly)
4. There is a good reason those features were added (nope)
New Good parts in ES6
4. Let / Const
7. String literals
8. Regex literals
Bad Parts is ES6
1. Proxies ( I disagree)
2. Generators (I disagree)
6. arrow functions (returns undefined)
Good Parts Reconsidered
8. Don’t use new
9. Don’t use Object.create
10. Don’t use this
11. Don’t use null
12. Don’t use falsiness
13. No for
15. Prototypes are bad. Memory conservation is a bad idea. Compilers can’t optimise.
“It takes a new generation to use good ideas”
I disagree with this part of the talk. Goto is a great idea when used with dispatch tables.
1. class-free programming / functional inheritance with closures as an alternate to classes and prototypes.
2. Better number type – Dec64
1. Advices against types (you still have to test)
2. Actor based language could be the next
4. System testing over unit testing
What do social networks actually provide ?
- No hosting mess
- Simpler UI
- Discovery / Search
- Friend Feeds
- Multiple media types
- Contact management
Mastadon can do 2, 3, 4, 6, 7. WordPress solves 1, 2, 5 and 6 but lets google do 3, email do 7 and RSS do 4. WordPress is IndieWeb. WordPress providing full text search across all its blogs and a friend feature could make it more like Mastadon.
Other indie web projects I am excited about,
- Owncast vs Twitch
- Peertube vs Youtube
- Lemmy vs Reddit
- Beaker p2p browser