Articles about tech

Low Tech

There is one space besides travel, writing, software, and entrepreneurship that particularly attracts me, and that is low tech. The low tech space is not only about sustainability, but it's also about making things with others. And since I'm a maker at heart, I can't help but want to jump aboard the hype train. Growing up, I wasn't allowed to mess around in my dad's garage, so I took my curiosity to the virtual world of computers. That's where my curiosity led me to make things by myself, like Photoshop montages or websites or online role-playing games. Now that I'm an adult thirsty for indepe...read more

On a JAMStack/Isomorphic-Rendered Hybrid Application

One thing I learned in college from Business Intelligence—the study of how to transform raw data into useful information—is that each data doesn't have the same granularity. Hence, some database tables, also known as dimensions, cannot be updated at the same rate. There are slowly-changing dimensions you can update once a week or once a year (e.g your business' yearly profit), and fast-changing ones you need to change in real-time (heart rate monitoring, for example). Similarly, web pages within the same website do not forcibly change at the same speed. It is common, however, to build each web...read more

On Transcription Software

Interviews are a great way to create original content, but they aren't easy to facilitate and distribute. You need great questions, a flow, and a directing line. If the interview is in an audio or video format, you need timestamps, notes, and transcriptions. Transcriptions are especially important. As a host, even if you publish the interview as-is, you'll need transcripts to improve your SEO. If you need to go through the whole interview to produce an article, it's way faster to transcribe the video directly and work from there. The average human's typing speed is somewhere between 40 and 75 ...read more

Four Sub-Systems Most SaaS Apps Need

If you're a frugal indie maker whose time is extremely limited and spread thin by multiple projects, there are four core services you can automate. Most SaaS applications are built-upon those sub-systems. If you manage to build one micro-service for each and host them on a personal subdomain, you save yourself countless hours re-developing them for your next project and tons of money on recurring costs. Authentication/authorization system: Auth0 is nice, but spend three days learning about OAuth, JSON Web Tokens, and reading your back-end web framework's documentation and you'll be able to ro...read more

Introducing (my) Attic

As I explained in a previous post, I want to automate some programming work. Developing one digital product is already hard enough, but I can't help the need to have by-products. If I want to be a better writer, I need The Co-Writers. I have to push my limits, so I also need to write substantial work in the form of books. I need to write books, so I developed Bouquin. I need a bigger toolbox to make more features, at a faster pace, while freeing time to write. This is why I'm building Attic, an open-source full-stack code generator for my Symfony/PHP projects. An app is a set of smaller apps l...read more

Imagining an Ethical Web

What would a manifesto for building ethical websites look like? I've thought about seven items so far: Empowerment over Enslavement: Remove the use of dark patterns to hook the user into doing less and becoming the product. Examples: remove misleading newsletter registration settings, inform about addictive behaviors Community-first: Support the development of strong sustainable bonds between the users rather than ephemeral relationships. Use competition sporadically to inspire and create excitement. Examples: add the possibility for users to interact with each other and outgrow the limits of...read more

Building a text editor

When I started The Co-Writers, I already had experience building text editors. They look simple, but they are in fact incredibly hard to get right. A few items to keep in mind if you'd like to build your own text editor: Text representation: avoid storing HTML in your database, and prefer instead editor state objects. I tried many plugins, but none beat DraftJS so far. The learning curve is high, but the level of customization is outstanding. A text editor built using DraftJS uses a JSON object to manage its state, which can later easily be converted into other text formats. Storing state obj...read more

The Offline-First Movement

I'm big into offline-first these days. It started with GatsbyJS, then I built Bouquin in PHP and created my first progressive web apps. Now I want to add offline-first functionalities to The Co-Writers while I'm improving the content management UX. You'd be able to read, write, and organize posts and collections without an internet connection. Offline-first decreases the amount of data you need to make an app work. You load it once, cache it, and update just what needs to be changed. As a software engineer, I find it extremely elegant because it's the most optimal way to increase performance w...read more

Nomad Laptop

It is often said that all you need to be a digital nomad is a laptop and a stable Internet connection, but technology has evolved so much over the last ten years that I'm not sure this is even true anymore. The price of 1GB of data is decreasing and new technologies such as progressive web apps and static-generated websites decrease the total amount of data you need to interact on the web. With even planning, a stable Internet connection is never an issue: I never had a problem publishing my daily post in more than a year of nomading, even when I was cruising in Ha Long Bay or lost in the moun...read more

Optimizing My Coding Process

As a software engineer, I find the no-code movement inspiring. Tech is an onion where each layer abstracts away the underlying complexity. Personal computers as we know them didn't exist 50 years ago. Now, everyone uses operating systems with built-in graphical user interfaces and we don't think twice about it. The no-code movement is just another logical step toward more abstraction: if you're not automating your process, someone else will do it for you. This is a great opportunity for programmers to make new digital products. One thing I've wanted to do for a long time now is to create a met...read more

The Future of Web Development

I've spent the last two weeks experimenting with new technologies to improve the user experience on my digital products. I started with a static file generator called GatsbyJS. I implemented a text editor with Markdown capabilities with a local auto-save feature. Then I built a toy app using a micro-service architecture: Gatsby on the front-end, a Symfony API on the back, an auth0 integration with JSON Web Tokens, and cross-domain requests. I'm now building a progressive web app using local storage. It works offline, it's fast, and it doesn't cost anything to host. What's more, it can be insta...read more

Humanized Tech

I see a lot of former engineering students moving away from more technical positions to work as managers or consultants. The same thing happens in the software industry. The pay is nice. You don't have to work outside in the rain and the cold. There is free coffee in the open space, and even snacks sometimes. The environment is always changing, but there is no lack of professional opportunities. It can be an ungrateful job though. A complex feature requires skills similar to that of a painter, but you don't get to put your name on it. I don't think I'm being overly dramatic if I say there is a...read more

Moving Fast and Breaking Things

Releasing code as fast as possible is taboo. As a software engineer, you are expected to design and test every aspect of your program before pushing it to a production environment. You can spend weeks thinking about the best way to solve a problem. Back in engineering school, our teachers asked us to write algorithms using a pen and sheets of paper. You had to get the code right on the first try because otherwise, your code wouldn't work. We were miles from the ethos of Facebook's early days: move fast, break things. It's understandable. When you accept a job position, you have to improve the ...read more

What I Love About Programming

When you sit down to code, you already know what the result will look like. This is the main difference between art and programming. A painter figures things out one stroke at a time. However, programming still lets you figure out how to deliver the solution and what it should look like: it's a highly creative job, but it's also a practical one where you are supposed to solve a problem. This pragmatic creative freedom is what I love about programming. I don't remember the last time I wasn't excited to sit down at my desk to do some coding. I can pick the projects and the features I want to wor...read more

Choosing a Programming Language

Some friends asked me the same question: "What programming language should I learn?" I tell them right away to go with Javascript. I assume two things by saying that: 1) they want to make websites and 2) they want to learn a technology that is in-demand and beginner-friendly. All you need is a browser and you can start learning right away. That's the short answer. The optimal answer is more complicated. Using the little programming knowledge you already have to make something is more productive than asking yourself what programming language you should learn. Choosing a programming la...read more

Frankenstein Monsters

How to learn good programming practices? Create Frankenstein monsters: patched code so ugly it becomes a pain to maintain. Mental pain is the best teacher. It forces us to find a solution, and fast. I made a Content Management System for an ex-girlfriend's portfolio website when I was 21. It was coded in PHP. I had heard about the Model-View-Controller design pattern while I was studying software architecture in college, and I wanted my CMS to implement it. The codebase was so awful it still hurts, but it taught me a lot about software development and I landed an internship in Geneva when I me...read more

Project-driven Web Development Apprenticeship

If you want to learn to code, you have to understand programming is a craft. What you know doesn't matter as much as what you did: a potter is not judged by his knowledge of the clay, but by the work he displays on his shop's shelves. An efficient software apprenticeship is project-driven. The focus of programming is not code, it's the stakeholders' needs: your colleagues, your users, and you. Learning to program is learning to identify and satisfy those needs through well-written code, just like writing is not merely about putting down words on a piece of paper. In other words, programming is...read more

Tech Stack to Write a Book

I wrote Alter-Nomad using Markdown and Pandoc. That's the tech stack I found after researching how to write a book using Markdown. The benefits are nice: Markdown allows me to focus on the content rather than the way it looks, it's easy to manage the different drafts using Git versioning, and Pandoc makes it easy to obtain a finished product in a single command line. It was nice and easy to use, and it did the job. The problem is that it's quite hard to customize. Pandoc uses a Latex generator to generate references, and it uses Cascading Style Sheets to design the resulting files. I had a muc...read more

Smithrandir, the Virtual Lab

I've been releasing a lot of products over the last two years. About a dozen. Most have been abandoned. Five are still alive, all need love and attention. How can I prevent myself from reinventing the wheel each time I'm making a new digital product? I came to the conclusion I should view my products as atomic parts of a bigger entity. Each product I made so far is a monolithic LAMP application: PHP/Symfony with React DOM and MySQL. What I need to make things more modular and performant is to shift toward a micro-service architecture and leverage platforms like Netlify to decrease my hosting a...read more

Training Routine for Programmer - Part 2

In part 1 I'm discussing why I need to develop a training routine to become a better programmer. Part 2 is a draft containing notes describing solutions to the identified problems. Part 3 will be about defining micro-habits to perform on a daily basis. I. General Hygiene 1. Equipment An Ergonomic Workstation helps prevent health issues: A) Increase your exposure to natural light, decrease night time work to avoid relying on artificial light sources. B) Sit on a comfortable chair with lumbar support and made of an airy fabric (no leather or hard surface, which tends to heat you up). C) Ergonomi...read more

Training Routine for Programmers

Heavily influenced by the way pianists exercise, I'm doing some research on how to become a better programmer by developing a training regimen. Exercising is a crucial part of a good work/life balance. Programming time is mainly spent hammering a keyboard: it's a sedentary life with little physical movements. Bad physical health is synonym with heart disease, thrombosis, and cancer. More specifically, programming is associated with carpal tunnel syndrome (bad wrist posture), vitamin D deficiency (lack of sun exposure), bacterial infections (unkempt keyboards), stress (software development is s...read more

Master Programmer

As a beginner developer, focusing on becoming a "10x engineer" is the wrong approach to get better at the craft of programming. You don't want to produce ten times what other engineers do, you have to make your own path. An amazing programmer is a master programmer, a developer who can do great work. That's our ideal: we may or may not reach it, the choice is ours to make every day. In software, you do great work by knowing how to learn how to code anything, with others. It's about being capable of contributing to masterpieces. You don't need to know everything by heart, but you can'...read more

How to This: Share Feature

User story: A user U can share a resource R owned by user O to a space S. Description: How can I can reproduce Facebook's share feature? 1) Relational database Table User_U: id Table Resource_R: id, fk_user_o_id (foreign key to user O) Table SharedResource_SR: id, fk_resource_id (foreign key to resource R), fk_user_u_id (foreign key to user U), fk_space_s_id (foreign key to space S), shared_at (datetime) Table Space_S: id Observations: We go with a denormalized schema. The data redundancy is quite small (a regular user shares a given resource in a space once or twice) so we will prefer increas...read more

How to Write Product Requirements as an Indie Maker

Requirement engineering is an entire subfield of software engineering, one that relies heavily on your communication skills: writing requirements is about defining your customers' fundamental problems, goals, and needs, that will later be answered by a software system - a mobile app, a website, an application programming interface... a tech product. A requirement specifies the desired behavior of a product, which can either be functional (a task, what the product does) or non-functional (a quality/constraint, how the product does what it does). A requirement is always written from the point of...read more

Notes: Requirement Engineering, lecture 1

Cornell notes from the Requirement Engineering lecture taught by Pr. Jelena Zdravkovic at Stockholm University (Lecture 1 - 2017) What is Requirement Engineering? It's about capturing the customer’s fundamental problems/needs/goals. What is a requirement? It's the expression of a desired behavior/condition of a system -- what does it do? -- without providing the solution (the design of the system will tell) What are the types of requirement? Functional (task) or non-functional (quality/constraints of the system) requirement. What are system stakeholders? A stakeholder is a person or organizati...read more

New Blog Engine

I'm completely re-designing my personal website to develop my audience and my activities. I want to centralize all my online content and products in one place that feels personal. The hard thing about owning a website is not launching it, it's keeping it updated. When someone types your name on Google, your personal website shows up first. It has to be the very reflection of who you are, what you stand for, and where you are headed. No one has time to hope around different social networks and tech products to see what you are up to: you are your best curator. Owing to those two last points, yo...read more

On Distributing your Content - SEO

Once you stop hiding you can finally start sharing your words with the world. That's when your writings begin to affect reality, and when a new problem arises: you need to effectively distribute your content so that people are willing to hear you out. Marketing content is never simple. I'm not an expert, but I can tell you what I learned along the way. I started writing because it's fun and I love it, but I kept doing it because I want to connect with people to build things together. To connect with more people, you need to share your content where it's relevant. The most efficient and sustain...read more

Something is gonna go wrong

I released new code yesterday and as usual stuff breaks. Something is always going to go wrong: broken features, change-averse users, unhandled edge cases... danger is everywhere. A launch is not just one moment in time, it's a cycle. And the more you go through the cycle, the harder it gets to overcome Launch Resistance - the fear of breaking stuff that used to work. Move fast and break things. Developers hear it a lot, and yet, there is always a lingering fear that things won't work out the way you want them to. They rarely do. I broke a core feature of the website: the writing editor. You c...read more

Notes on "Natural Language Toolkit" - Chapter 2: Accessing Text Corpora and Lexical Resources

Accessing Text Corpora 1.1 Gutenberg Corpus What is a corpora? A large structured collection of texts. How to get the text list of a corpus? corpus.fileids() How to access a default corpus in NLTK? from nltk.corpus import gutenberg nltk.corpus.gutenberg.words('austen-emma.txt') How to obtain the content of a file without any linguistic processing (not split up into tokens)? gutenberg.raw(fileid) How to divide the text up into its sentences? gutenberg.sents('shakespeare-macbeth.txt') 1.2 Web and Chat Text How to access default web texts in NLTK? from nltk.corpus import webtext How to a...read more

Moving off Slack

As some of you might know I'm currently developing an integrated chat within 200WaD. I want members to write more together, so a chat gathering everyone is a must-have. Slack is a bit cumbersome to use: you have to install it, configure your account, and actually write/check messages. Not everyone has used Slack before, and I can't expect everyone here to sign up. However, we all subscribed to 200 Words a Day. That's where the magic should happen. At first I wanted to integrate Slack within 200WaD using their Application Programming Interface, but it turns out I made a mistake: I didn't read t...read more

Integrating Slack in a Website

Instant communication channels have been around for a long time. Their business value cannot be ignored: you can build entire communities from a chat application. Telegram, Slack, or Discord have become mainstream tools in most organizations. Relying on free external services has its limits though, most users do not want to install anything or create an additional account. It's especially true for tech products such as web applications: it's already hard to convince a user to use your product, why would he/she want to subscribe to another service within it? It feels redundant, it's not practic...read more

Where I'm heading to, technology-wise

I talk a lot about my projects and my day-to-day life as a nomad entrepreneur, but not so much about my skills as a software engineer. I decided to flip this behavior by starting to release more technical content. My current stack is Symfony (PHP) on the back-end and JQuery/Twig/Bootstrap on the front-end. I got into Symfony because that's the framework I had to work with at my first job, and since I have a more back-end background I never got into front-end frameworks and just tweaked my apps with some JQuery. Symfony is a MVC framework, so I don't really feel like changing it. PHP is a popul...read more

Teaching People How to Program

I got into programming as an autodidact, I ended up graduating from college with a major in software. Both formal and informal education has pros and cons. Autodidactism fueled my drive, it's what got me hooked to the craft. Engineering school taught me the basics, how each concept fits together. More importantly, how software quality is defined and evaluated - which is what makes you an initiate, a professional. Formal education is no longer a necessity to work in most companies. Its most essential aspects can be replaced by personal practice, books, online courses, or support communities. Le...read more

Notes on "Natural Language Toolkit" - Chapter 1: Language Processing and Python

Computing with Language: Texts and Words 1.1 Getting Started with Python 1.2 Getting Started with NLTK How to download corpora? import nltk nltk.download() How to load corpora? from nltk.book import * 1.3 Searching Text What is a concordance view? A concordance view displays every occurrence of a given word in its context (= preceding and following words). string.concordance('word') What other words appear in a similar range of contexts? text.similar('word') How to examine shared contexts between words? text.common_contexts(['word', 'writer']) What's a dispersion plot? How to obtain i...read more

Releasing a Markdown editor tomorrow

I've been thinking a lot about how to improve my writing process and using a markdown editor definitely helps with that. I used markdown to take notes in college, to present projects on Github, and more lately to write an ebook. Markdown is a plain text language, so it's easier to focus on the substance over the form while writing. It's also simpler to import/export and share across many platforms. The second advantage of Markdown is how it goes well with versioning. You can store all your different writing drafts in a Github/Gitlab/[...] account and never lose anything ever again. It's obviou...read more

The Maker Economy: Learn to Code

The No-Code Movement has its advantages: you can build minimum viable products and proofs of concept in minutes for free, and no-code development platforms are incredibly easy to use. Making a personal website or manipulating databases have become common tasks where programming creativity is not inherently fundamental. Reinventing the wheel is overkill in those use cases, and not everyone is interested in learning how to code. Generally speaking, no-code tools are for people willing to outsource all coding activities. If you're a tech maker, however, learning how to program will give you treme...read more

Redesigning my Personal Website

My personal website is not well-kept, its potential is untapped. My motives changed a lot in one year, my online domain should reflect those. My current goal is to reach ramen profitability. At $1000 per month, I need 500 people to buy a $2 product from me. I have three income sources at the moment: my 200 Words a Day patrons (90% of my total revenues), the revenues from my ebook (10%), and my new Patreon account (0%, not launched). The objective is to design the flow of the website to convince people to help me help them. You need three things to persuade someone online: added value, utmost t...read more

Minimalist Project Management

My workflow is pretty simple: I write everything down. Sometimes in blog posts or in tweets, mostly in logging applications and lists. I know everything I've delivered over the past 160 days up to the minute. At the operational level, my to-do lists are centralized in different Trello boards. One per project, including 200WaD. Most boards are organized in a Kanban fashion (to do/on-going/done). Project management is an effort at improving organizational communication flows. Communication is both cause and consequence. All the feedback I receive from my stakeholders through email, Telegram, Sla...read more

Software, my Love

I started programming at 13 to build my own role-playing game forum engine in PHP. I failed, but the magic of software stayed with me and I wanted to become a software engineer. I am fortunate I didn't discover programming through the prism of formal education. I had an issue to solve, coding was the solution: it wasn't forced on me, it came to me. A program is a bag of instructions transforming an input into a worthwhile output. Software allows us to represent knowledge in a different way, sometimes more efficiently, to access it or distribute it. The beauty of software resides in its educati...read more

Toward an art of software development

What is art? Technical mastery, innovation, expression, beauty. Those are the words that come to mind. Art is about emotions, not rationality. About how it makes you feel, rather than how well it works. In The Pragmatic Programmer, Andy Hunt and Dave Thomas say: "the construction of software should be an engineering discipline", but that "it doesn’t preclude individual craftsmanship". It is assumed by many that software development is purely an engineering discipline. I do not agree. "Art" comes from the Ancient Greek word "Techně", which implies the tec...read more

There is no worthless app

Oscar Wilde famously said that all art is quite useless. Similarly, one could argue that all apps are useless, meaning, they are not needed to live. And this is a peculiar argument which I think is the reason why so many makers never launch or never go through with their ideas. A fear of uselessness. But being useless is not the same thing as being worthless. Making an app can only benefit you in the long term. Your market value is all about your capacity for learning hard materials fast and creating at an elite level, in both speed and quality. Making is about both. Apps are either tools or w...read more