Carol of the Bells in its original Ukrainian

This holiday season, I learned that the melody of the Christmas carol “Carol of the Bells” is from a Ukrainian New Year’s song called “Shchedryk” (Щедрик), first arranged in the early 1900s, which in turn is based on a traditional Ukrainian folk melody. Here is “Shchedryk” sung in its original Ukrainian:

Happy New Year everyone 🇺🇦

Handcrafted software in a mass-produced world

I’ve joked with my friends that I want to get into building hand-crafted, artisan software. Then Lian Proven of The Register makes the case for it, such as higher quality and being more attuned to a specific group’s needs.

I can think of a few examples of folks making hand-crafted software:

Bob James performs the theme song from Taxi

I’m a bit too young to have watched (or certainly understood) the sitcom Taxi, but I remember the opening theme song vividly. Here is Bob James, who wrote the song, performing it with his jazz trio at age 82. (Sometimes the YouTube algorithm is good for something!)

Yang Liping’s Rite of Spring

Last night, I watched Yang Liping’s interpretation of Stravinsky’s Rite of Spring at Stanford. Totally stunning and definitely worth watching. We also enjoyed her conversation with Thomas Mullaney (Stanford professor of history and East Asian languages and cultures) — like him, I didn’t fully understand what I saw 😂 but it set off my brain in all sorts of directions.

Here is a good overview of her work:

Roy Clay Sr.: a salute to a Black pioneer in Silicon Valley

Wow, Roy Clay Sr. was such a pioneer: leader of the development of HP’s first computer, the first Black executive at HP, the first Black elected to the Palo Alto City Council, and so on. The history of Black Americans in Silicon Valley and the tech industry needs to be better known.

This blog is working again!

Even though I haven’t blogged in a while, I at least try to keep the version of WordPress and PHP up-to-date. Last year, my hosting service DreamHost notified me that it would start charging me for using PHP 7.4, which was no longer supported. So I upgraded all of my PHP installations to version 8.1, to avoid the extra charge. However, I forgot to first upgrade the WordPress installation running this blog. This completely borked my blog, throwing a PHP error for every page.

I finally managed to fix it today, by doing the following steps:

  1. Install a fresh installation of WordPress directly from DreamHost, which allows DreamHost to automatically keep WordPress upgraded
  2. From the DreamHost control panel, go to phpMyAdmin to view the MySQL database for the old WordPress installation. Export the following tables to .sql files:
    • wp_commentmeta
    • wp_comments
    • wp_postmeta
    • wp_posts
    • wp_term_relationships
    • wp_term_taxonomy
    • wp_terms
  3. In the database for the new WordPress installation, also export the tables with the same names as above.
  4. For each exported .sql file from Step 3, copy the CREATE TABLE statement and paste it into the corresponding .sql file from Step 2.
  5. In the database for the new WordPress installation, drop the tables as named in Step 2, and then import the .sql files that I exported in Step 2. In this case, dropping the tables was fine, because the new WordPress installation didn’t have any content yet (besides theme boilerplate).
  6. In wp_user in the old database, copy the row for the user that authored all of the posts, then insert that data into wp_user in the new database.

And voila, it worked!

I also took this opportunity to fix an encoding issue. At some point when I upgraded WordPress in the past, the default encoding to view switched from Latin-1 to UTF-8, but the database was still in Latin-1, so a bunch of characters turned into garbage, such as curly quotes (’, “, ”) and dashes (–, —). I found a StackOverflow post with a SQL statement to change the encoding of particular columns of a database from one encoding to another, and applied it to the post_content and post_title columns in the wp_posts table:

UPDATE wp_posts SET
post_content=convert(cast(convert(post_content using latin1) as binary) using utf8mb4),
post_title=convert(cast(convert(post_title using latin1) as binary) using utf8mb4)
WHERE 1

I’ve also changed the theme to The Minimal Blogger, which is more modern than what I had before, especially that it is a responsive theme that looks good in mobile. It looks quite different from the rest of my website, so I’m not yet sure I’ll stick to it, but it’s better than before.

Computing as a career

This is an update of a blog post I wrote in 2012. Be sure to look at a comment written by Daniel Azuma, who made a lot of excellent points of his own.

Here are some thoughts for students who are considering computing, including computer science and software engineering, as a career. While these tips are particularly geared for high schoolers going to my alma mater, Monta Vista High School, they can apply to many others.

What do I enjoy about computing?

Computers are capable of doing amazing things, but in reality, they’re really dumb. You have to give them precise instructions on how to do something. If you get it wrong, they can’t guess what you want them to do. Even the capabilities of AI systems are narrow — a speech recognition program can’t recognize images.

I find taking a task, breaking it down into smaller pieces, writing instructions to do those small tasks, and putting it all back together inherently satisfying. You get a sense of mastery by getting a sophisticated piece of equipment to do what you want it to do.

I also enjoy the fact that my work has a direct impact of millions of lives. Every time someone searches for something on Google, code that I have written is executed. I certainly feel like I am making a difference.

My typical workday

As a software engineer at Google, my day is not just about sitting in front a computer monitor, pounding out “code” (the instructions that tell the computer what to do). The image of the solitary hacker is a myth.

Before writing any new code, I need to consider how it will work with code that Google already has. It’s like building a structure — you could slap an addition onto an existing building, but that could destabilize the whole structure. Or you can carefully design your addition so that it integrates well with what is already there.

So I will meet with my colleagues to discuss the problem I’m solving and how I intend to solve it, either face-to-face or through e-mail. I may also write a design document that gives all of us something to refer to.

Sometimes I write code with a colleague, especially if the code is tricky. This process, called pair programming, lets one person type while the other looks up documentation or spot errors on the fly. It can be intense but also more fun, since you’re sharing your joy (and pain) with someone else. It also reduces distractions, since you can’t check your e-mail or social media while your partner is waiting.

Once I’m done writing a piece of code, I then need to integrate it with the existing code. But before I can do that, another software engineer must review the code that I wrote. They may (and probably will) point out bugs that I need to fix before integration. I also review the code of other engineers.

Our project team has short status meetings everyday, which last five to ten minutes. Our larger group has status meetings every week, which often last only fifteen minutes. I also attend other one-off meetings about design issues that affect our whole group, and I answer questions that other engineers may have about the work our team is doing.

So a lot of time is spent designing, reviewing, and communicating my ideas with others, not just programming.

Now you’re interested in pursuing computing as a career. How do you start?

Before College

Before talking about classes specific to computing, I should mention that your other classes are still important. Besides math and science, writing and speaking are the most useful skills in your computing career. If you can’t get your point across to your colleagues, your great ideas will never be accepted.

Perhaps the most obvious way to try out computing is to take AP Computer Science A in high school. Since the test uses the Java programming language, you may want to also take the Java programming class that Monta Vista offers, the year before taking AP CS A.

However, there is another class that Monta Vista offers that gives a broader perspective on computing. AP Computer Science Principles emphasizes basic concepts of computing, through projects such as manipulating color and sound, or collecting and analyzing data through sensors. Most of the work is collaborative, which is how the real world works. And the class does not require any programming as a prerequisite. A design-heavy class such as graphic design, journalism, or drama also qualifies. If computing intrigues you but you still have some doubts, I highly recommend this approach.

If you’re a motivated self-learner, there are plenty of alternative approaches to learning how to program, a fundamental skill in computing (but not the only one), which you can try on your own. You can also try these before going into AP CS.

There are lots of online resources for learning how to program, including:

There are several organizations that run programs for students in underrepresented groups to learn computer science and programming, including:

If you’d like to learn programming in the context of an interactive visual environment, Processing and p5.js are popular languages for creating visual art and animation.

Instead of Java, you could choose another language like Python, which has many conceptual similarities with Java but is less verbose. There are a few tutorials for learning how to program using Python, such as A Byte of Python or Learn Python the Hard Way (I have not tried either of these myself).

There are several systems that lets novice programmers create games and visual simulations. These include:

Tickle for iOS lets you write programs to control drones, robots, and other devices.

The key is to try these out, experiment, and have fun with it. It will take some time and persistence, but the rewards are well worth it.

College

Learning computer science in college is much more than learning how to program. You discover the breadth that CS has to offer, from the math that forms the theory to the electronics that actually do the work.

There is widespread agreement on the top four computer science university programs (in no particular order): Carnegie Mellon, MIT, Stanford, and UC Berkeley. However, there are plenty of great CS programs all over the country, including (but not limited to) Brown, Caltech, Cornell, Georgia Tech, University of Illinois at Urbana-Champaign, University of Texas-Austin, University of Washington, and University of Wisconsin-Madison. It’s hard to go wrong with any of them, so you should also pick a college based on your own personal preferences, such as small liberal arts school versus large research institution.

There are many different ways to teach computer science. For example, Carnegie Mellon, Harvey Mudd, and Georgia Tech are pioneers in designing their programs to attract and keep women and underrepresented minorities in computing, which the field desperately needs.

No matter where you go, I highly recommend doing summer internships. These are becoming more and more important for getting a job after college, or for getting into graduate school. Internships expose you to how different companies operate and give you some real world experience. While I was in college, I did two summer internships (IBM and Microsoft). You should start look for summer internships in the previous fall, in other words, right after starting the academic year. It’s tough to think about summer when school has just started, but there is a lot of competition for internships these days.

If you’re considering graduate school, I also recommend doing undergraduate research work if your university offers the opportunity. For example, Caltech has Summer Undergraduate Research Fellowships.

Graduate School

Unlike other science and engineering fields, getting a Master’s or PhD degree in computer science does not automatically mean you will be earning more money or have higher job status than those with a Bachelor’s degree. However, attending graduate school, especially a PhD program, gives you different types of opportunities than a college graduate.

Getting a PhD in computer science means you want to deeply explore a specific topic within a specialty of computer science. This means that the school you will apply to will depend on what specialty you want to go into, such as artificial intelligence or operating systems. For example, the University of Wisconsin-Madison is well known for databases, while the University of Utah is a leader in computer graphics.

By the time you get your PhD, you will know lots of leading figures in academia and industry in your specialty. Networking becomes a key skill that you learn. You also learn how to figure out what questions are still unanswered in your field, and address it in a way that no one else has before. It sounds a little daunting, but that’s what graduate school is for.

In fact, throughout graduate school you come to realize that there are lots of questions out there, and the real problem is how to pick a problem that you can reasonably answer in a few short years, so you can graduate. Persistence and endurance, more than sheer intelligence, is the key to getting a PhD.

Once you have a PhD, you have the opportunity to get a job where you can look farther out in the future than most people, especially if you become a professor or join a research lab at a company like Microsoft or IBM. These jobs are nearly impossible to get without a PhD. But at the same time, you will become “overqualified” for jobs that only need a Bachelor’s degree. So getting a PhD changes your opportunities, but it doesn’t necessarily broaden them.

Give it a shot

I hope you consider computing as a career. It’s rewarding and satisfying in its own way, and the fact that it’s also in high demand is just a bonus. Even if you decide to do something else later, the skills you learn in computing will serve you well. Good luck!