Roy Tang

roytang.net

Programmer, engineer, scientist, critic, gamer, dreamer, and kid-at-heart.

Blog Notes Photos Links Archives About

Subscribe: RSS JSON

2020 September

  • On Mobile App Development

    This post is just quite a few thoughts on mobile apps and mobile app development, all mishmashed together. I don't claim to be a mobile app specialist, at best I've dabbled in them, but enough to form some opinions I guess? A Bit of History My first exposure to mobile app development when I got pulled to help my then-company's then-fledgling mobile team with cleaning up the codebase for their iOS app. This was back in maybe 2011? It was one of those projects where some devs built a quick proof-of-concept demo using new technology, then management liked it and

    read more (1693 words)

2020 August

  • On Mozilla and Firefox

    Mozilla made the tech news recently for laying off a whole lot of people. (Official statement). People were alarmed and worried about the future of what is the last major independent browser and the open web, bit it looks like it isn't that bleak. Most of the layoffs were to teams other than those working on Firefox, things like the experimental browser engine Servo, devtools, and MDN. The core Gecko team seems to be unaffected. Not that these things aren't important. MDN, if you're not familiar, is a set of documentation of web standards and browser support, available online, that

    read more (904 words)

2020 July

2020 June

  • Scraping Facebook

    I had been meaning to quit Facebook for more than a year maybe, but I kept putting it off. The main reason being that I like having backups of my own digital data (still very much a pack rat), and Facebook's social media export is less than ideal, for me at least. Less than ideal why? It doesn't include a lot of content I would like backed up, including: comments on my posts (there have been some good conversations with friends over the years I would prefer to preserve) things I've reposted from other people content of certain groups I'm

    read more (586 words)

2020 April

  • Technical Interview Notes

    I've had the good fortune to be on the interviewer side of technical interviews much more often than I've been the interviewee. I've been doing a few more of these over the past couple of years and made some notes, so I thought I'd talk about technical interviews for a bit. Caveat: these are largely based on my own experiences, in the local environment here in the PH. Technical Exam / Screening Many companies will ask applicants to undertake a technical exam before letting them advance to further stages of the recruitment process. This kind of screening is most useful

    read more (1825 words)

  • Working with people from other cultures

    Unless you’re working at a small shop that only serves local clients, software development these days is often an international endeavor. That means the aspiring software developer needs to be able to work with and get along with people of different cultures. In the company I worked with, most projects back in the day we would have a person from the foreign office in charge. Their roles were either as project manager (PM) or system analyst (SA). They were the ones who would be interacting directly with the clients so they get to decide which things need to be done

    read more (1063 words)

  • Pure HTML Toggles

    Just last month, I wrote a method of implementing element toggles using a pure CSS approach. While that post was educational for me, it turns out there was an even simpler way of doing things. I found out about it when I read this post by Jamie Tanna. Apparently the details and summary tags already support HTML toggles, so we can do this with neither CSS or JS! I've updated the spoiler tags on this site to use this new method. I also used this method for the Table of Contents on certain posts (currently only the Covid19 diary). Sample

    read more (230 words)

  • Web Application Security

    A while back one of the biggest leaks of personal information in history was made by hackers accessing the Commission on Elections database here in the Philippines. More than 50 million voter registration records, including information such as full names, date of birth, address, among others. A small percentage of the data leaked also included email addresses and even passport numbers. The hack exposed more than half of the country’s population to the possibility of social engineering and other exploits. It was certainly a national embarrassment, especially for those of us working in software development. But the truth of the

    read more (1352 words)

  • Bespoke vs Product Development

    For most of my time working on software projects, it has always been for bespoke projects. Bespoke basically means a software program or package tailor-made for a specific client. The client provides all the requirements, the team fleshes out more details and specifications, some prototyping may or may not ensure, and implementation proceeds thusly. It’s relatively straightforward compared to product development. I only started getting involved with “product”-like projects over the in the latter half of my career as a software developer. A "product" is a more general use software program or package, perhaps sold to the mass market or

    read more (1094 words)

  • Naked CSS Day

2020 March

  • Browsers and HTTP

    Drew Devault wrote a great post/rant about the reckless limitless scope of modern web browsers: I conclude that it is impossible to build a new web browser. The complexity of the web is obscene. The creation of a new web browser would be comparable in effort to the Apollo program or the Manhattan project. For the past year or so, I've been thinking about contributing to an open source project. Haven't gotten around to it yet, but I have looked at a few projects of interest. Preferably it's something I use on an every day basis, so Firefox was one

    read more (815 words)

  • Pure CSS Spoilers

    Edit 2020/04/17: A month and a half later, I found a better way to do this! I previously had some post that had some content hidden via spoiler tags, using a custom Hugo shortcode. Since I'm an old-school developer I was previously doing this using some Javascript run on load: let elements = document.querySelectorAll(".spoiler_header"); Array.prototype.forEach.call(elements, function(el, i) { el.addEventListener( 'click', function( event ) { let nextEl = el.nextElementSibling; let display = getComputedStyle(nextEl)['display']; if (display == 'none') { nextEl.style.display = 'block'; } else { nextEl.style.display = 'none'; } }, false); }); This is the modern age however. We should really be

    read more (320 words)

2020 February

2020 January

  • Flask vs Django

2019 November

  • Is SQL a dying art?

    I was helping my brother check some database issues the other week, and he mentioned how impressed he was with how quickly I was able to come up with SQL queries on the fly. I told him that SQL was one of the skills I considered myself to have mastery over. This shouldn't be surprising given my early career path: for most of my first year working as a software developer, I was working on reports which involved lovingly handcrafted (and oftentimes quite complicated) SQL queries. And there was a lot of Oracle PL/SQL too by my second year, I

    read more (365 words)

  • What to do in a production crisis

    Despite our best efforts as software developers, it can still happen: production goes down. Or some sort of bug introduces catastrophic data error. Hopefully you have a support/DevOps team to handle the response. If not, the dev team themselves have to step in. This usual means a mad rush to figure out what happened and how to fix it, sometimes during off hours and maybe even into the early morning, all while facing pressure from clients and higher-ups. I was advising another developer in such a situation a while back, and it was his first stint as technical lead so

    read more (441 words)

  • DevNotes: Python's yield

    I've been using Python for well over 10 years, and I still don't have an intuitive mastery of one of its keywords: yield. Everytime I see it in someone's code I need to stop and mentally remind myself what it does. I figured I'd write a devnote to help improve my recall. Typically, yield is used in a function with a loop, like so: def some_func(lim): for i in range(0, lim): yield i yield means the function returns a "generator" that can be used as an iterable in a loop: for val in some_func(5): print(val) You can also straight up

    read more (172 words)

  • The Perils of Handover Documentation

    A while back I found myself having to figure out how to compile/build/run a mobile application. The developers previously assigned to the project were no longer available to consult with, but they did leave behind some documentation. However, their documentation quality left a lot to be desired. The instructions they left basically amounted to: npm install ionic serve ionic codrova run android/ios Okay, first sign of trouble is that their instructions were basically commands that anyone who knew the app used Ionic would be able to Google. But ok, I gave this a shot, even though I had not used

    read more (725 words)

2019 August

  • Python: Markov Chains

    Back when I was still learning Python in 2008, one of the first "fun" scripts I wrote was a text generator using Markov chains. I'd run it against all the chat logs I had with people at work and serve the results from a webserver on my computer. THe results were often amusing and sometimes hilarious. Since I've been going through my old scripts lately, I thought I'd update that script to Python 3 (read: add parentheses around print params and use pathlib) and run it against all the posts on this here site. I added the script to my

    read more (162 words)

  • Devnotes: Python Pathlib

    Ever since I started learning Python back in 2008ish, I've been using it as my primary scripting language for various tasks such as processing log files, organizing my own file system, processing stuff on this blog, and so on. A lot of it is basically moving files around. In the days of Python 2, that involved a lot of imports of different libraries like os, shutil and glob. It can become a bit messy with so many imports, and I often can't remember which import I need for a particular case and end up having to search for the documentation

    read more (316 words)

  • Devnotes: Migrating Mercurial to Git

    Big news in online repositories this week is that Bitbucket is sunsetting support for Mercurial! This might be the death knell for Mercurial, although Git was already the super popular choice before. Back when I started using online source control for my personal coding projects I started out with Bitbucket over Github because they offered unlimited private repos and Mercurial (which I had already tried out before at work, so at first I preferred it over git). Now that Gitlab and Github both offer unlimited private repos, there's no reason to stick with Bitbucket either. I had already migrated most

    read more (279 words)

  • I recently found myself doing a really small project as sort of a proof of concept/demo for a potential client. It often seems that it might be a waste of time to do something like this since you don't know if the project will actually push through or maybe the client will want something else. To kind of hedge my bets a bit, I decided to take the opportunity to try out some new technologies so that no matter what I at least learned something from all of this. (What is life if not learning?) Django Rest Framework. I've been

    read more (750 words)

  • I decided to start doing small "devnotes" on developer stuff I'm doing so I can refer to them later (and also because I feel like I could use more technical content on this blog) Today is about PostgreSQL. I haven't used it much beyond standard ANSI sql stuff. You won't always have a graphical interface to access your database, sometimes you need to ssh to prod and query the database from the shell. The command line for PostgreSQL is psql. You can do: psql [database-user-name] -d [database-name] and it should prompt you for your password. But when I tried this

    read more (317 words)

2019 July

  • Upgrading a React Native Project

    I have a small mobile app that I wrote using React Native (henceforth RN) back in 2017, currently deployed on the Google Play Store and Apple App Store. Shortly before my US trip, I got an email from Google telling me about a required action: By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code.

    read more (1080 words)

  • 10X Programmers

    The topic of the mythical "10x programmer" has been the topic of discussion recently on tech twitter, due to a thread listing out the supposed signs of being such a mythical beast. 10x engineersFounders if you ever come across this rare breed of engineers, grab them. If you have a 10x engineer as part of your first few engineers, you increase the odds of your startup success significantly.OK, here is a tough question.How do you spot a 10x engineer?— Shekhar Kirani (@skirani) July 11, 2019 The thread received a lot of negative responses, mainly because several of these items can

    read more (1943 words)

2019 April

  • Learning from failure

    Success is not final, failure is not fatal: it is the courage to continue that counts. -- Winston Churchill I already typed the above quote into the post, then realized I had already used it before. Whatever, just goes to show, I'm no stranger to failure. I was reminded of this quote because recently I prepared a demo for a project that didn't push through. At first I was annoyed at the wasted effort, but I realized that I had wisely taken the demo project as an opportunity to learn/sharpen some skills. Specifically, I used it to study the Django

    read more (155 words)

2019 March

  • A Quick Twitter App I Wrote

    I wish I had a more concise way to describe it, but I really don't. Some time ago this guy I follow on Twitter, visakanv wanted to know how to do a certain search: he wanted to know who a given famous person follows on Twitter, and among those, finds the one who follow him (visakanv), so he could network through them. I might not be explaining the concept too well, here's the thread. Anyway, in a fit of "I'm a bit bored, anything interesting I could do?" I figured I could set up a quick webapp to do that.

    read more (373 words)

  • Lies and marketing

  • Don't stay in the same place too long

    If I could give some advice to someone starting out in their software development career, it would be this: Don't stay in the same place too long. The first company I worked at, I stayed with them for thirteen years, which I now feel was way too long. I have to admit, the work was hard and challenging, but I was young and had a lot of energy and was willing to work the long hours. I was good at the work and the enjoyed the company of the people I worked with so in a certain sense I got

    read more (480 words)

  • Another repost from my Quora answers, this time some info for anyone looking to move into programming. What are the pros and cons of making your career in programming? Pros: It is a very rewarding career financially. Software development often ranks in the top 10 highest-earning careers in most countries There is a lot of scope - you could be developing web applications, mobile applications, embedded applications, client-side, server-side, data analysis, artificial intelligence, games, etc It is very difficult to be bored. You can always automate away the boring stuff. Different projects always present different challenges. The field is evolving

    read more (459 words)

  • Studying a large project codebase

    Given my recent misgivings about Quora, I thought it might be a good idea to cross-post some of my answers from there into this blog, with some edits even. So here's the first one! (stuff in italics were added during the cross-post) How can you read and study a large software project source code? Attacking a large, existing codebase that you are unfamiliar with can be a daunting endeavor. Don't expect that you will be able to easily navigate the codebase quickly after just a few days of studying it. Familiarity will come with experience. Some things that can help:

    read more (393 words)

2019 February

  • Reddit PH: Software Dev Q&A

    I had some free time the other day so I randomly decided to post in the PH subreddit's regular afternoon random discussion thread, asking for questions about software development. I ended up typing some longish answers, I thought I'd copy them over to the blog in case anyone was interested. TBH I meant more like StackOverflow type questions with specific technical problems, but I ended up answering mostly career-related questions, which is fine, but disclaimer: I don't claim to be an expert, these are just my opinions on things. capybara_c0de: project/s junior devs should include in his/her portfolio? I've technical

    read more (1124 words)

  • Hacktoberfest

    Last October I participated in #Hacktoberfest, sponsored by DigitalOcean and Github. It's a "celebration" to promote open source activity, and basically you just need to submit 5 pull requests to any github repository, and they give away swag to anyone who completes the activity. Microsoft held a [counterpart celebration] where they only require you to submit 1 pull request to any Microsoft repository. I've always wanted to start participating in Open Source, but it's a bit difficult to find a good place to contribute (other than logging issues of course). So when I heard about this activity, I thought "Why

    read more (371 words)

  • TriviaStorm: Text and Answer parsing

    A while back I started a Twitter trivia bot as a weekend project. That bot is still up and running on Twitter, you can check it out there! But today, I thought I'd write about the answer-checking mechanism used by the bot. It was a bit interesting to me because it was the first nontrivial use I had for Django's unit testing framework. I'm not too keen on unit testing web functionality (something I still have to learn), but this seemed an appropriate first use of a unit test framework for several reasons: the bot had to be able to

    read more (579 words)

2019 January

  • I still Google the most basic things

    I've been working with Javascript for more than a decade. Last week while helping another developer debug a problem, I had to Google how to check if an element exists in a Javascript array, something superbasic, that one would expect most newbies to know. I'm sure I Google some superbasic thing at least once a week. It's not embarassing or anything, it's a common occurrence. I'm surely not alone. Just last night a tweet about this crossed my TL: In C++ we don't say "Missing asterisk" we say "error C2664: 'void std::vector<block,std::allocator<_Ty>>::push_back(const block &)': cannot convert argument 1 from 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<block>>>'

    read more (339 words)

  • Finding Time to Learn new Things

    Someone responded to my post on things to learn in 2019 by asking how one finds the inspiration to learn all of the things. Well, my first answer was that those are just things I find interesting and may look into, but that's not really an answer for the inspiration part. Software development is a very wide field, one where the amount of things you can learn increases daily, so it's almost impossible to keep up with everything. I think that having a natural tendency or curiosity towards learning new things is a distinct advantage in this industry. Having at

    read more (435 words)

  • Git vs CVS

    A while back we were tasked with helping a client's internal dev team to migrate their repositories from Subversion to Git. The distributed VCS seemed ideal for their situation - they had a very small in-house dev team managing contributions from external subcontractors. The main rationale was that their process of merging contributions from the external developers was extremely complicated and often resulted in conflicts that were challenging to merge. Before this, I hadn't actually used Git too deeply myself (aside from cloning stuff from Github), and especially not in a team setting, so the training one of our other

    read more (702 words)

  • Tech to Learn in 2019

    One of the things about self-identifying as a "Full Stack Developer" or "Solution Architect" is that there's no shortage of things to learn, and oftentimes it's good for your career-wise to at least have some passing knowledge of a bunch of technologies. It helps that I really like the field as well. I try to make sure I study or learn at least one new programming language or framework every year (though I am willing to stretch that definition as needed). Here's a list of tech I'm looking at learning in 2019: Rust or Golang. Between Python and JS, the

    read more (691 words)

  • Solution Architect

  • Revisiting C++ after a decade

2018 December

  • Adding Developers to a Late Project

    For any nontrivial software project of at least moderate team size, there can be a significant cost to onboarding a new team member, especially at later stages when you are rushing to meet deadlines. The most signifiant cost is of course the communication overhead as described in the Mythical Man Month. Fun story, the CEO of a company once told me they would add more developers to a delayed project to meet the deadline and when I pointed out the increased overhead he said to me that it wasn't a problem because they would just assign modules to those devs

    read more (790 words)

2018 November

  • My history in text editors

    Text editors (and by extension IDEs) are a programmer’s best friend. I thought I’d look back at a number of text editors I’ve used over the years. (I grew up with Windows, so I won’t list vim/emacs/nano here, even though I’m at least a bit proficient with vim by now. That is, I know how to exit vim.) Notepad -- of course, the default editor in Windows. The one we turn to when all else fails. It used to be pretty bad at handling UTF-8 and probably just gives up on large files, but for quick and dirty work, it’s

    read more (666 words)

  • 168 hours vs 10000 hours

    According to Malcolm Gladwell’s book Outliers, you need 10,000 hours of continuous sustained practice to become an expert. There are 168 hours in a week. If you never sleep and you eat as you practice, you can become an expert in 60 weeks. (Around 14 months) If you sleep 8 hours a day, you only have 112 hours in a week. If you eat as you practice, you can become an expert in 90 weeks. (Around 22 months) If you sleep 8 hours a day and spend 4 hours a day for meals and leisure (TV, movies, etc), you only

    read more (260 words)

  • Version Issues

    SCM (Software Configuration Management) doesn’t just refer to version control for the software you’re building. It also means controlling the versions of software you depend on. This includes operating system and programming runtimes. Sometimes even minor version differences can cause issues in running your software. I have two example stories to share: One of our clients asked us for help with an upgrade their production servers from CentOS 6.4 to 6.9. It was supposed to be a straightforward yum upgrade, which meant of course there would be a problem. The problem turned out to be one of the SOAP calls

    read more (320 words)

2018 October

  • Change and Risk and Governments

    Systemic change is difficult. I'm talking about software projects/systems, but there are a lot of parallels with societal systems too, like governments or states. I've been in large projects with hundreds of thousands of LOC where a lot of the code was painful to read and full of code smells and so on. It happens over time as projects get maintained by different developers and teams or different enhancements or changes are made. It becomes more difficult/costly for new developers to work on the project as things are brittle and may easily fall apart. I've also had the dubious pleasure

    read more (552 words)

  • Django Blog Application

    Ten years ago this month, I started studying Django by trying to build my own blog application. I found the code lying around while I was going through some backups lately. It's way out of date, it uses an early version of django. I thought of bringing it up to speed, but that didn't seem practical. Instead, for archival purposes, I cleaned it up a bit and uploaded the code to a github repo. (Helpful github immediately warned me that having a very old version of Django was a security risk lol). There's a lot more information in the README.md

    read more (176 words)

  • Gladwell and Risk Management

    Malcolm Gladwell, in an article from 1996 discussing the Challenger disaster, tells us: This kind of disaster is what the Yale University sociologist Charles Perrow has famously called a "normal accident." By "normal" Perrow does not mean that it is frequent; he means that it is the kind of accident one can expect in the normal functioning of a technologically complex operation. Modern systems, Perrow argues, are made up of thousands of parts, all of which interrelate in ways that are impossible to anticipate. Given that complexity, he says, it is almost inevitable that some combinations of minor failures will

    read more (523 words)

  • Working hours and overtime

    Rockstar was in the gaming news recently because they mentioned that some of them had worked 100-hour weeks on their massive sequel to Red Dead Redemption coming out soon (no idea if I'll play this). The idea of 100 hour weeks seemed insane to me, and it got me thinking: I've done some serious overtime before, have I ever gotten close to that amount of work in a week? Luckily, I didn't have to speculate too much, because I had data (I love data). My previous employer had us track and log our work hours, and I had kept a

    read more (294 words)