tag:blogger.com,1999:blog-78134809982261107402023-11-16T06:49:18.922-05:00Observational HazardDavid Kopec's BlogDKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comBlogger59125tag:blogger.com,1999:blog-7813480998226110740.post-19868148221029651382023-02-15T02:11:00.001-05:002023-02-15T02:11:10.020-05:00Adding Contacts on Apple Platforms without Entitlements<p>Adding a contact to the user’s address book on Apple platforms using <a href="https://developer.apple.com/documentation/contacts/requesting_authorization_to_access_contacts">the prescribed method</a> requires jumping through a lot of hoops. You have to:</p>
<ul>
<li>add <code>NSContactsUsageDescription</code> to your <code>info.plist</code></li>
<li>add an entitlement to your app</li>
<li>ask the user for authorization (requires an in-app popup)</li>
<li>if you want to modify the <code>note</code> field of the contact, you need to <a href="https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes">get permission from Apple using an online form</a> to be able to add a special <code>com.apple.developer.contacts.notes</code> entitlement to your app; Apple may take up to two weeks to respond just to reject you</li>
</ul>
<p><strong>For one-off contact additions, there’s a simpler way that requires none of that.</strong> The idea is basic: you create a contact, save it in <a href="https://en.wikipedia.org/wiki/VCard">vCard format</a>, and then ask the operating system to open the vCard file in the Contacts app. When the Contacts app opens, it will ask the user if they really want to add the contact. This requires no entitlements (even if you’re using the <code>note</code> field), no authorization, and even works in a sandboxed app.</p>
<h2>The Code</h2>
<p>I put a Swift <a href="https://github.com/davecom/AddContactExample">macOS example app on GitHub</a>. The code should be easily modifiable to work on iOS. Conveniently, the <code>Contacts</code> framework includes a method for serializing contacts into vCard format. You start by creating a <code>CNMutableContact</code> and filling it with your arbitrary data:</p>
<pre><code class="swift">let contact = CNMutableContact()
contact.contactType = .organization
contact.organizationName = "Silly Restaurant"
contact.phoneNumbers = [CNLabeledValue(
label:CNLabelPhoneNumberMain,
value:CNPhoneNumber(stringValue:"5555555555"))]
let address = CNMutablePostalAddress()
address.street = "31 Silly Way"
address.city = "Silly Town"
address.state = "Vermont"
address.postalCode = "05401"
address.country = "USA"
contact.postalAddresses = [CNLabeledValue(label:CNLabelWork, value:address)]
contact.urlAddresses = [CNLabeledValue(label: "Apple", value: "https://www.apple.com/")]
</code></pre>
<p>Then you can serialize the contact using <code>CNContactVCardSerialization</code> and save it to a temporary file:</p>
<pre><code class="swift">let data = try? CNContactVCardSerialization.data(with: [contact])
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("contact.vcf")
try? data?.write(to: fileURL)
</code></pre>
<p>Finally, it’s just a matter of using <code>NSWorkspace</code> to open it in the Contacts app:</p>
<pre><code class="swift">if let contactsURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: "com.apple.AddressBook") {
NSWorkspace.shared.open([fileURL], withApplicationAt: contactsURL, configuration: NSWorkspace.OpenConfiguration()) {
(app, error) in
if let error = error {
print("Had a problem trying to open the Contacts app.")
// your error handling here!
}
}
}
</code></pre>
<p>I hardcoded <code>com.apple.AddressBook</code> as the app to open the vCard here, which is Apple’s Contacts app. You should probably not specify the exact address book app incase the user has a different default.</p>
<p>It works, but you might say, what about that <code>note</code> field? If you add a <code>note</code> property to your <code>CNMutableContact</code> you will notice it is silently dropped when the contact is added to the address book. This has nothing to do with the <code>note</code> special entitlement. It turns out <code>CNContactVCardSerialization</code> does not have support for either images or the note field. You can easily add both of these back. <a href="https://stackoverflow.com/a/70172455/281461">A Stack Overflow post provides some code showing how to do so.</a></p>
<h2>Security Loophole?</h2>
<p>When working on a new version of my macOS app <a href="https://apps.apple.com/us/app/restaurants/id941109837?mt=12">Restaurants</a>, I came across the <code>note</code> field entitlement requirement. I submitted a request to Apple using their online form to have access to the entitlement and a week later I was rejected for my request being too vague. Fair enough, it’s their sandbox, and they have the right to reject me for being too vague. But waiting so long to get an answer was frustrating and adding contacts requires a lot of ceremony. Frustrated, I went down the road of this alternative method for adding contacts.</p>
<p>It seems strange to me that you need authorization through Apple’s prescribed method just to add contacts but there is this “side way” using a vCard file that doesn’t require any authorization or entitlements. I’m not saying it’s a security vulnerability. It’s more of a loophole. If Apple really want developers to have to be authorized to do anything with Contacts, this shouldn’t exist. </p>
<p>I filed a security report with Apple thinking maybe they had looked over something so obvious. But I didn’t get a bounty. Instead, they closed it, and marked it as “expected behavior.” I basically expected as much. It seems like too obvious a thing to really be an oversight, but perhaps adding contacts should not require so many hoops to jump through using Apple’s way. </p>
<p>However, a key difference between the two ways of adding contacts, is that an authorized app has access to the contacts database, whereas this method using a temporary file simply opens the Contacts app, which is then in full control of the situation. It’s a lot safer. Any risk is mitigated by the Contacts app. But from a user perspective they look quite similar. In the authorization case, the user gets a pop-up within your app. In the example above, the user gets a pop-up within the Contacts app. The downside, is it does take the user out of your app. But if this is a rarely used feature of your app, maybe it’s worth it, to not have to deal with the frustration!</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-58713115605350080852022-08-23T02:34:00.001-04:002022-08-23T02:34:53.871-04:00Book Review: Weaving the Web<p>Although it came out in the year 2000, <em><a href="https://amzn.to/3ADhn2i">Weaving the Web: The Original Design and Ultimate Destiny of the World Wide Web</a></em> is as relevant today as it was when it was published. <em>Weaving the Web</em> is a memoir by Tim Berners-Lee about the creation and early growth of the Web. Most of the book concentrates on the ideas, insights, software, and previous attempts that led to the Web—as well as the decisions and evangelism that allowed it flourish in the ’90s. The last quarter of the book deals with Berners-Lee’s ideas about how the Web should evolve. Some of the philosophy behind the Web explained in <em>Weaving</em> is very relevant to current debates around censorship, centralized control of content, and privacy.</p>
<p>We cannot fully understand something if we do not understand its origin story. <em>Weaving the Web</em> fills in many blanks for the curious reader. Like any great creation, the Web did not form in a vacuum. It was the result of over a decade of experimenting by its creator. In the early chapters of <em>Weaving the Web</em> you feel like you are there with Berners-Lee and his colleague Robert Cailliau as they pushed the Web forward. Like Jony Ive has said—ideas are fragile when they’re first created. You get a strong sense of how Berners-Lee nurtured his idea. </p>
<p>Perhaps even more interesting than the origin story, is the philosophy and core ideas that Berners-Lee imbued the Web with. Some of his outlook is surprising and insightful. For example, he does not credit HTTP or HTML as the most important innovation, but instead the URI. “It is the most fundamental innovation of the Web, because it is the one specification that every Web program, client or server, anywhere uses when any link is followed.” (page 39)</p>
<p>Throughout the book, Berners-Lee advocates for decentralization and for empowering individuals as creators. It’s important to note that the book came out at the height of the Web 1.0 era, before the onslaught of social media and YouTube-like content sharing sites. A time when the Web was very static. Yet, he didn’t intend it that way. “I never intended HTML source code (the stuff with the angle brackets) to be seen by users. A browser/editor would let a user simply view or edit the language of a page of hypertext, as if he were using a word processor.” (page 42)</p>
<p>The first web browser that Berners-Lee developed was also an editor. He continually encouraged companies to come out with combined browsers/editors but most declined. It’s interesting to think how differently the Web would have evolved had the browser/editor concept taken off.</p>
<p>Berners-Lee’s philosophy goes beyond technology. He designed the Web to be an open, decentralized system that anyone could participate in. “Whether inspired by free-market desires or humanistic ideals, we all felt that control was the wrong perspective. I made it clear that I had designed the Web so there should be no centralized place where someone would have to ‘register’ a new server, or get approval of its contents. Anybody could build a server and put anything on it.” (page 99)</p>
<p>As the Web has become more and more dominated by a few large tech companies, many feel this early philosophy has been lost. It’s not the current ethos. It’s not the way that most people interact with the Web. Berners-Lee was very prescient in understanding this threat. “If a company claims to give access to the world of information, then presents a filtered view, the Web loses its credibility. That is why hardware, software, and transmission companies must remain unbiased toward content. I would like to keep the conduit separate from the content.” (page 132)</p>
<p>The last quarter of <em>Weaving the Web</em> deals with Berners-Lee’s vision for how the Web should evolve. Much of it did not come to pass—at least not in the way he advocated. It includes explanations of standards like SMIL that never really took off. It speaks to how creating a standard is not as important as making a killer app. This section is interesting from a historical standpoint—to understand what people were thinking about after the first decade of the Web. But it’s not nearly as interesting as the rest of the book.</p>
<p>Overall, <em>Weaving the Web</em> does a great job recounting the story of the Web’s creation. It’s well written and insightful. Most importantly, it clearly states the philosophical underpinnings that inspired Berners-Lee and propelled the Web through its critical first phase of growth. It provides a lot of historical context and insight for many of our current debates around the Web.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-81675120760892698202022-07-08T17:19:00.002-04:002022-07-08T17:27:17.927-04:00Introductory Programming Assessment Must Accommodate Copilot-like Assistants<p>GitHub Copilot and other machine learning based programming assistants will fundamentally change how we assess competency in introductory programming courses. Computer science educators can no longer rely on formulaic assignments and an honor code to ensure original work that demonstrates programmatic ability. Copilot-like assistants have blurred the line between the programmer’s work and machine generated code (largely modifications of pattern-matched work from their training sets). While they provide a productivity boost for the professional programmer and the advanced student, they may potentially act as a crutch for introductory students, who will rely on these tools in lieu of developing a strong understanding of their own.</p>
<p>There are certain standard problems that we are accustomed to assigning because completing them demonstrates the ability to implement fundamental simple algorithms. A prior strategy to reduce plagiarism has been to provide scaffolding code or put a spin on a problem to make it unique. Unfortunately, Copilot-like assistants are almost as capable in these scenarios as they are at writing generic simple algorithms. In my own preliminary testing on a (what I believe to be) unique scaffolded assignment of my own creation for an introductory class, Copilot was able to contextualize the comments and write most of the smaller functions accurately with just a little bit of my assistance.</p>
<p>What can we do about this? How can we assess competency in this environment? Over the past few decades, computer science education, like many other fields, has been moving away from exams and towards project-based learning. This has been a positive trend for a host of well-researched reasons that are spelled out in the literature. Unfortunately, I think this trend will need to be at least partially reversed for introductory courses. Students must demonstrate the ability to write and comprehend fundamental algorithmic code without the assistance of an AI. We could try banning it, but that never works well. Instead, we can try to assess knowledge “live.” How much do you know in this moment without someone or something’s assistance? And that’s what an exam evaluates.</p>
<p>Of course, exams have well-documented downsides, including but not limited to the fact that a significant number of bright students do poorly on them who do fine with project-based learning. I am not suggesting we return to a world of exams making up the majority of the grade in a course. Instead, I am suggesting that exams and exam-like evaluation will need to be a greater percentage of the mix. We can be creative. An oral presentation can in some instances demonstrate knowledge as well as an exam. A project coded live in class on machines that do not have AI assistants enabled, can serve as a pseudo exam.</p>
<p>We do not need to return to the dark ages. But we must acknowledge that these new tools mean that how we evaluate introductory programming knowledge has to change. I have had graduates obtaining first jobs in the insurance, defense, and healthcare industries building programs that have life-and-death consequences. They need to have a firm grasp of the fundamentals. What happens when Copilot makes a fundamental mistake and the person using it does not have the skill to realize?</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-54422537907152805142022-05-21T03:48:00.001-04:002022-05-21T03:48:45.132-04:00My Experience with Technical Interviews in 2022<p>I just had the chance to experience 8 different technical interview processes. And they were not what I expected! I didn’t get asked a single data structures and algorithms question. No <a href="https://leetcode.com">leetcode</a> for me. This may largely be related to the types of organizations that I applied. Despite writing a <a href="https://classicproblems.com">book about algorithms</a> and teaching a class called “Data Structures & Algorithms,” I don’t do particularly well at white-boarding. I hadn’t done a software development job search in 10 years, and based on what I had read, and what I had heard from my students, I expected to do some white-boarding. But I didn’t have to do any white-boarding!</p>
<p>I wanted to write this post as a kind of follow-up to <a href="https://pnc.st/s/kopec-explains-software/323f757a/why-are-technical-interviews-so-intimidating-">a podcast episode</a> we did a few months ago about technical interviews. We really emphasized the prevalence of algorithmic problem solving questions and brain teasers. Maybe we got that wrong. Maybe that’s an outdated view. Or a view limited to only certain kinds of companies.</p>
<p>In this post, I’ll tell you about what the processes were like at the anonymized companies that I applied, how the rounds were ordered, and how the search ended for me. But first some background for context: Earlier in my career I worked as a full-stack web developer at a couple startups and then worked for a few years as a freelance iOS developer. Then I shifted to computer science education. The past six years I’ve been working as an assistant professor of CS at a teaching college. In the past three years I’ve been the co-program director of the CS program. </p>
<p>So, I’m a strange candidate. I didn’t know if I should be applying for mid-level roles or senior-roles. I don’t have any corporate software development experience. I do some open source work and write books and teach. I have a few very small indie apps. And as I mentioned, I worked for a few years in startups and as a freelancer. So, it was hard to tell how companies would see me.</p>
<p>I did a mini-job search this month. I had the option of a promotion and a new contract at the teaching college I work at, but I wanted to see what else was out there before I signed the dotted line. I want to emphasize that I was sincerely interested in exploring changing careers back into the world of software development. I was a serious candidate. This wasn’t a lark. At the same time, I knew there was a reasonably high probability I would choose to stay in my current profession.</p>
<p>That’s why I decided to do a very targeted search. I only applied to a select group of (mostly remote) roles that seemed like a very good fit. And I did all of the applications in 1 day. After that day, I didn’t apply to any more companies. The entire process from doing applications to offer was about 2 weeks.</p>
<h2>How it Started</h2>
<p>On May 2nd, I applied to a little more than a dozen jobs on LinkedIn and via the iOS Dev Jobs mailing list. I also posted on the monthly Hacker News “Who wants to be hired?” thread. That was it. I never applied to any more jobs after May 2nd.</p>
<p>By Wednesday I had received a few immediate rejections, 5 first-round interviews as a result of my applications, and 3 inbound first-round interviews from companies that saw me on Hacker News.</p>
<h2>How it Was Going</h2>
<p>I got a second round with just about every company I applied to. Apparently I did very well in those first round interviews. By the end of the first week I was very confident.</p>
<h2>How it Ended</h2>
<p>I’m going to break your suspense before I get into the details because it will help frame some of my decisions around why I pulled out of several of the companies’ processes. I received two offers by May 17th. They were time sensitive. I ended up accepting an improved offer to stay at my current employer. The other offer I received was for a senior software engineer position with a salary that is literally more than double my current salary. It was very compelling and I really liked the person I would’ve been working for and his team, but I ultimately decided I didn’t want to give up the academic lifestyle. I really do like where I work. It’s a great place. But it was a hard decision. I also received two outright rejections from companies that I had gone through three rounds with. I pulled out of the other interview processes after accepting the offer to stay.</p>
<h2>The Processes</h2>
<p>I am anonymizing all of the companies here as much as possible. I’m not here to criticize anyone specifically, but instead praise and criticize some of their interview processes more generally.</p>
<h5>Company 1 — to be a Mac software developer</h5>
<p>Company 1 is a small/medium sized maker of software for the Mac. I make indie Mac apps myself and first learned to program for the Mac when I was 14 years old. So, this was a very interesting company to me. And something I knew I would enjoy doing.</p>
<p><strong>Application or Reach Out</strong></p>
<p>I applied.</p>
<p><strong>The Process</strong></p>
<p>The first round was a 30 minute screen with the co-founders of the company. The second round was a technical interview that was just a conversation about some of my past work and programming philosophy with the CTO. The third round was a take-home software development project that you had unlimited time to complete and were paid to do.</p>
<p><strong>Result</strong></p>
<p>I pulled out before completing the third round because I had received the other time sensitive offers. I think I really would’ve enjoyed working for them, so I asked the CTO to keep me in mind for part-time or contract roles in the future.</p>
<p><strong>My Feelings</strong></p>
<p>This was a very good process for a small to medium sized company. It was very personable (meeting with the owners right off the bat) and yet also seemed to hit at the technical in exactly the right way. The technical conversation was non-intimidating and I think really did give the CTO a good sense of me and what my skills are. The take-home project was very relevant to the work they do and a good test, although I pulled out before completing it.</p>
<h5>Company 2 - senior software engineer working in Python</h5>
<p>Company 2 is a Fortune 200 company looking for an addition to a relatively small inner team that works on B2B products for an exciting and growing market in green energy. </p>
<p><strong>Application or Reach Out</strong></p>
<p>The hiring manager reached out to me based on my Hacker News post.</p>
<p><strong>The Process</strong></p>
<p>The first round was a 1 hour conversation with the hiring manager. I appreciated that he took the time to talk to me for that long instead of sending me to HR. He was erudite and personable. He was specifically looking for someone who could be an internal teacher which I really appreciated and made the job even more compelling to me. There was a short call with HR after. The real second round was a 5 hour interview with 5 inner rounds: 3 technical interviews (data modeling in Python, testing/QA in Python, and commenting on a Python pull request), a culture interview with 2 engineers, and a final interview with the hiring manager.</p>
<p><strong>Result</strong></p>
<p>I received a very compelling offer for more than double my current salary. I did seriously consider taking it, but ultimately accepted the improved offer from my current employer for the reasons I mentioned above.</p>
<p><strong>My Feelings</strong></p>
<p>The hiring manager was fantastic and I really enjoyed talking with him. If he hadn’t been so great, I could see a one hour first round being a bit much. On the other hand, the entire interview process really only had two rounds, so the entire process is very reasonable. While I don’t love live coding, the engineers on the live coding technical interview rounds really made me feel like it was a collaborative process. They definitely weren’t checking for syntax. They were checking for thinking. They helped me when I got stuck without giving too much away. The pull request technical interview was great because it really let you shine as a developer in a different way—as someone with judgement instead of just someone who can code. Overall it was one of the best renditions of live coding I’ve seen.</p>
<h5>Company 3 - iOS developer at a consulting company</h5>
<p>Company 3 is a reasonably well known consulting company. I used to work as a solo iOS consultant (freelancer) so this role seemed particularly compelling to me.</p>
<p><strong>Application or Reach Out</strong></p>
<p>I applied.</p>
<p><strong>The Process</strong></p>
<p>The first round was a 1 hour conversation with a senior engineer there who seemed to be guiding the process. The second round was a 1 hour technical interview with another engineer there that asked me technical questions about Swift (i.e. how do closures work in Swift). The third round was first some simple live coding in Swift, and then building a very simple table view based app in Xcode. I believe I completed all of the tasks successfully. The two technical rounds both ended with some more “soft questions.” In the third round I was asked by one of them if I had any “enterprise development experience.” And I said I didn’t have any, which is true and was evident from my resume.</p>
<p><strong>Result</strong></p>
<p>I found out just after I had received the two offers mentioned above that I was not selected to continue to the fourth and presumably final round. I had actually already accepted one of the offers, so I was about to pull out of the process anyway, but they emailed me first, so I unfortunately got to feel the rejection! They said the reason was that I didn’t have enough enterprise software development experience. Which makes sense because I don’t have any. But they knew that before the first round, so it was a strange reason to reject me. Perhaps they just had a better candidate who did, or perhaps they didn’t want to tell me the real reason.</p>
<p><strong>My Feelings</strong></p>
<p>The first round was great. They said they were interested in my book writing and podcasting work. I found the second round interviewer hard to read, but the questions he asked about Swift I thought were fair. I heard after by email that I did well. The third round was not great. It was live coding doing some fairly trivial stuff, but the lag of using a remote system did not work well for laying things out in Interface Builder. I did have trouble remembering during the live session how to do the syntax of some simple exception handling in Swift, so maybe that’s the real reason I failed that they didn’t want to tell me. I did get it right eventually, but it took me longer than it should have to remember the syntax. However, I don’t think asking live syntax questions is a good way of conducting technical interviews—in the real world we can just look it up. And I did politely criticize the laggy setup at the end too by suggesting it would’ve made more sense to let me share my screen instead of remotely controlling theirs (probably not a good move to criticize your interview setup). Ultimately the feedback for why I didn’t get to the final round felt too short—I’d like more detail. And if the “not having enterprise software development experience” was the real reason they should have screened me out after the first round, not the third. I think doing a live coding session in Xcode makes little sense in the iOS world—let us do a take home or look at our prior open source work or indie apps. That’s a better test of what we can do. However, I sincerely liked the company and could see myself applying again if I ever do another job search.</p>
<h5>Company 4 - senior iOS developer at well known iOS app company</h5>
<p>Company 4 is very well known. Their iOS app has millions of users. They were looking for someone to be in a senior role on the iOS team. They described it as a leadership role in the interviews.</p>
<p><strong>Application or Reach Out</strong></p>
<p>I applied.</p>
<p><strong>The Process</strong></p>
<p>The first round was a 30 minute screener with HR. The second round was a 30 minute technical conversation with the head of the iOS team. For the third round you were offered either a 2 hour live Swift coding test or a take home. I chose the take home. It was building a fairly simple iOS app but with plenty of room for embellishments. They said you had as much time as you wanted, but also said not to spend more than a few hours on it. After two days I got a message from HR saying they were eagerly awaiting my submission (I hadn’t started because of other interviews and them saying I had as much time as I needed). I told them that I had been busy (the truth) and would finish it by the end of the weekend (4 days later, which I did). I sincerely thought I did a fine job on the app. I even added a couple extra features, like some custom bar chart drawing, that was not required in the app description.</p>
<p><strong>Result</strong></p>
<p>I was not selected after the third round. The email from HR said “Thank you for taking time out of your schedule to complete our assignment. We appreciate the time and care that went into completing the assignment. At this time, we have received several assignments back that have set our candidate caliber very high. It has not been an easy decision but we will not be advancing to the next round interview. Please continue to view our job board for any future openings you are interested in.”</p>
<p>I replied because I really wanted more specifics after doing the take home because I thought it was reasonably good: “Thank you. I understand and appreciate the consideration. If I could receive any feedback about what I could have done better on the assignment I would appreciate it so I can improve my work in the future.”</p>
<p>The final reply from HR was: “The feedback was all positive, we just didn’t have a good match on the technical side. I do wish you the very best.” I’m not sure exactly what that means. Was the feedback all positive on the technical side but the techniques I used were not a good match? Was my code amateurish in style but good logically? Was my use of older technologies not good? I really would’ve liked more feedback after the time spent on the take home.</p>
<p><strong>My Feelings</strong></p>
<p>I felt this company had a very fair process. But their final feedback was not great at all. After spending several hours on an unpaid take home project, you’d like to at least know the specifics of why it wasn’t good enough or why overall you weren’t a good candidate. That would have to come from engineering, not HR of course. But HR could pass it on. The most likely explanation is that they were telling the truth in the first email—there simply were higher caliber candidates applying at the same time. But the second email then made me doubt that. What does it mean for the feedback to be all positive but to not have a “good match on the technical side.” What is it that I could’ve done differently to bring my take home to the next level and be a good technical match? I sincerely wanted to know. I thought my app was pretty good for the time they told us we were expected to put into it (“a few hours”) and not getting to the final round honestly gave me a bit of imposter syndrome :).</p>
<h5>Company 5 - educational non-profit lead developer position</h5>
<p>This is a non-profit with a strong engineering culture. They were looking for someone to lead one of their large initiatives which is based on a Web app written in Ruby on Rails.</p>
<p><strong>Application or Reach Out</strong></p>
<p>I applied.</p>
<p><strong>The Process</strong></p>
<p>I first had a 15 minute chat with the founder. He was super nice. The real first round though was a 1.5 hour conversation with him. It was wide ranging. We talked about technical stuff including him asking me to show him some of my work, and he asked me some well prepared interview questions about product improvements they could make and how I saw the product. The third round would’ve been working directly on their codebase (paid) to implement a couple features after speaking with two of their engineers for about an hour. But I pulled out before the third round. One thing I really didn’t like was that in preparation for the third round you had to sign up for all of their services (Slack, Stripe, Logging service, etc.). In total I received 7 invite emails for the third round. It was a bit much.</p>
<p><strong>Result</strong></p>
<p>I pulled out of this one before even receiving the other offers because I had a bad feeling before the third round. I decided I really didn’t want to work in Ruby on Rails (bad memories of a startup I did 10 years ago) and I also had a feeling that I wasn’t a good culture fit. I felt a bit bad pulling out the night before the third round but I didn’t want to waste their time or my own.</p>
<p><strong>My Feelings</strong></p>
<p>It’s a super cool non-profit but the third round process didn’t make a lot of sense. Sure, you want someone to show they can work on your actual codebase. But requiring them to sign up for 7 different services is a bit much when they are likely doing other interviews. I’m glad I pulled out because I did a lot of hard thinking about it and really knew it wasn’t a good fit for me technically or culturally. It was a tough decision though because they really do have a great mission and great founder. But I think this made me realize that the technology and culture I’m going to be working in is as important as the product.</p>
<h5>Company 6 - developer relations at advanced startup</h5>
<p>This is an exciting startup that’s pretty far along. They have a product that is solving real problems for real clients already. Developer relations seemed like a good intersection for me between my technical communications skills (teaching, writing, podcasting) and software development abilities. In some ways it seemed ideal, but at the same time I didn’t have any background in working with their type of product.</p>
<p><strong>Application or Reach Out</strong></p>
<p>They reached out to me based on my Hacker News post.</p>
<p><strong>The Process</strong></p>
<p>The first round was a 30 minute screen with one of the founders. The second round was a 45 minute conversation with their head of engineering. The third round would’ve been a written interview (you fill out 5 detailed question in a Google Doc).</p>
<p><strong>Result</strong></p>
<p>I pulled out after the second round because I received the other offers and had to decide between them. The timeline just didn’t work out. But they actually reached out to me after I pulled out to ask if I would reconsider. That was super unexpected and flattering. I was very impressed by them overall. </p>
<p><strong>My Feelings</strong></p>
<p>It was clear in both interviews that the team is experienced and intelligent. I have regrets about not getting to work with such a sharp team in a role (developer relations) that I think really exploits all of my different skillsets. At the same time, I was a bit hesitant to work in developer relations on a product that’s in a space I didn’t know anything about. I have a strong feeling they will be very successful and kind’ve have some FOMO about it. I also regret not getting to do the written interview process because I pulled out. I’ve never done a written interview before and it seems like a very unbiased way to judge a candidate.</p>
<h5>Company 7 - iOS lead at small startup</h5>
<p>This is a startup in a space that I would call a form of social networking. They were well funded, but funded by friends & family, which is a bit of a red flag for me based on my earlier career. </p>
<p><strong>Application or Reach Out</strong></p>
<p>They reached out to me based on my Hacker News post.</p>
<p><strong>The Process</strong></p>
<p>The first round was a relatively casual chat for over an hour with one of the founders. It was really wide ranging and I felt like we really connected. The next round was supposed to be a conversation with the more technical co-founder, but it never happened before I had to pull out due to the other offers.</p>
<p><strong>Result</strong></p>
<p>I pulled out as mentioned above because of the other offers.</p>
<p><strong>My Feelings</strong></p>
<p>This company is early enough and small enough that they didn’t have a great technical screening process in place. I actually mentioned that to the founder and maybe it’s something I’ll even help him with in the future. We’re still in touch by email and the product is definitely interesting. At the same time, I would’ve had some real hesitancy to join a startup funded by friends and family because I did that a decade ago and we ran out of funding.</p>
<h5>Company 8 - software developer at huge multi-national</h5>
<p>This was a poorly defined role at a subdivision of one of the most well known technology companies of the 20th century. The job is at an office near where I live, so I figured it was worth a shot to at least find out more.</p>
<p><strong>Application or Reach Out</strong></p>
<p>I applied.</p>
<p><strong>The Process</strong></p>
<p>The HR representative reached out to me by email. I replied. She didn’t. She reached out to me again by phone. I replied. She didn’t. We finally connected for the first round, which was an HR screen.</p>
<p><strong>Result</strong></p>
<p>I pulled out during the HR screen. The salary was too low.</p>
<p><strong>My Feelings</strong></p>
<p>This company is out of touch and it showed even in the application process. The UI of their job site was the worst I’d seen. Also, companies should post salaries on job descriptions so as not to waste people’s time.</p>
<h2>Remainder</h2>
<p>I got rejected without even an HR screen from about seven other companies that I applied. They were mostly big companies. This kind of makes sense because my resume is very non-traditional for these kind of roles and I doubt someone who is looking at me as the whole person and potential developer (for example looking at my open source projects) is necessarily working in HR at a big company. Smaller companies seem to more often have people with software development experience doing first rounds.</p>
<h2>Conclusion</h2>
<p>Overall, I got a great offer in just two weeks. I can’t really complain about that. And interestingly it was from someone who reached out to me on Hacker News instead of somewhere that I applied. While I ultimately just accepted an improved offer at my current employer, I came away from this process with three takeaways: </p>
<ol>
<li>If you have a non-traditional, but strong background, having that be well understood by a hiring manager is really important. You need to put all of yourself out there and get that information to that hiring manager in as succinct a form as possible. My Hacker News post did that for me.</li>
<li>A lack of feedback after doing a take home test doesn’t leave a candidate feeling good. Employers, please respect that people put time into doing a take home and give them detailed feedback.</li>
<li>leetcode problems do not seem as prevalent as the zeitgeist would have you think. Or maybe that’s the selection bias of where I got interviews. I mostly didn’t interview at very large corporations.</li>
</ol>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-43021584384454290732021-09-26T22:53:00.002-04:002021-10-18T01:35:14.839-04:00Building Retro Dither: Dithering Algorithms, Run-Length Encoding, Resource Forks and More!<p>Today I launched a new novelty Mac app, <a href="https://oaksnow.com/retrodither/"><strong>Retro Dither</strong></a>. Retro Dither gives any photo a cool retro look using just black and white pixels. You may want this for artistic effect, or you may want to export your photo to <a href="https://en.wikipedia.org/wiki/MacPaint">MacPaint</a> for display on a retro Mac. Retro Dither <a href="https://apps.apple.com/us/app/retro-dither-b-w-is-beautiful/id1586423971?mt=12">launched on the Mac App Store today</a>.</p>
<p>Note that we’re talking about just black and white, not grayscale (no grays here!). Amazingly, dithering algorithms make pure black and white images look like grayscale. You’ll get an old-school newspaper look, or a look like your photo just came off of a Mac from the 1980s. And this works with any photo in any bitmap format (JPEG, PNG, HEIF, etc.). Retro Dither can then export your dithered image to MacPaint format for display on black and white Macs going all the way back to the 1986 <a href="https://en.wikipedia.org/wiki/Macintosh_Plus">Mac Plus</a>.</p>
<p>This is the story of how I developed Retro Dither…</p>
<p>I was working on my next programming book, which will be an intermediate Python projects book, when I came across an <a href="https://beyondloom.com/blog/dither.html">article about <em>Atkinson Dithering</em> on Hacker News</a> by John Earnest. <a href="https://en.wikipedia.org/wiki/Dither">Dithering algorithms</a> can be used for approximating the look of an image with less colors. Atkinson Dithering is one that is particularly well suited for approximating an image using just black and white. I was in the middle of developing a project for the book related to computational art and I was thinking I would need another art project to fill out the chapter. And Atkinson Dithering really caught my eye. First, because it looks cool. Second, because I was a Mac user growing up and I remember all the software and games that actually used it.</p>
<p>But there was a problem. After reading John’s article, I found the algorithm too simple to sit alongside the other projects I was developing for the book. I can explain the gist of it to you in a few sentences. You take each pixel in an image one at a time from the top left of the image to the bottom right. You check if it’s closer to black or white. Whichever it’s closer to, you turn it into (if we stopped there, we’d have a simpler dithering algorithm known as <em>Threshold</em> and it wouldn’t look great). Then you take the difference between black or white and the original pixel and call that the “error.” You spread that error into some of the pixels to the right and below the original pixel. Then you continue to the next pixel. John explains it in <a href="https://beyondloom.com/blog/dither.html">more detail in his article</a>.</p>
<p>Then I got an idea. <a href="https://en.wikipedia.org/wiki/Bill_Atkinson">Bill Atkinson</a>, the creator of Atkinson Dithering, was also the creator of MacPaint, a program I loved growing up. What if we not only dithered the image, but then we exported it to MacPaint format? That would be really cool and would add a bit more heft to the project. So, I started researching the MacPaint file format and <a href="https://www.fileformat.info/format/macpaint/egff.htm">found this article</a>. It’s not a particularly complicated file format, but it at least includes another useful algorithm, <a href="https://en.wikipedia.org/wiki/Run-length_encoding"><em>Run-Length Encoding</em></a>, a simple compression scheme where instead of writing out repeated sequences like “AAAAAAAAA” we essentially would write 2 bytes that say “9 As”. Now we have two simple, but interesting algorithms. That’s perfect for a project in the book.</p>
<p>I had to learn a bit more about the MacPaint file format. For example, it encodes pixels at 1 pixel per bit before it does the run-length encoding on the pixel-packed bytes. 0 is for white pixels and 1 is for black pixels. It runs the run-length encoding on a per-scanline basis. Every MacPaint file contains exactly 720 scanlines and 576 pixels per scanline (basically a 576 x 720 resolution). I found my hex editor, <a href="https://hexfiend.com">Hex Fiend</a>, really helpful when debugging. I would look at my output MacPaint files and compare them to example MacPaint files, including some I still have saved from my childhood. I also found <a href="https://github.com/thejoelpatrol/macpaint-file">an open source project</a> that converts files the other way (MacPaint -> modern bitmap). I could run my program’s converted MacPaint files back through it and see if the same image came out the other end.</p>
<p>With the help of <a href="https://pillow.readthedocs.io/">Pillow</a> for reading the initial bitmap image for conversion, I was able to build the whole thing in a couple hundred lines of Python. Again, this was the perfect size project for the book, so I was feeling really good about it. Then I tried my MacPaint files in actual MacPaint and there was a problem. They wouldn’t open!</p>
<p>Thinking back to my early days in computing, I remembered about type and <a href="https://en.wikipedia.org/wiki/Creator_code">creator codes</a>. These were metadata that the <a href="https://en.wikipedia.org/wiki/Classic_Mac_OS">Classic Mac OS</a> (versions 1 through 9) used to associate a file with the program that should open it instead of using a file extension. The problem was my files had none. I used a Classic Mac program to add them back in and my images successfully displayed in MacPaint! But this wasn’t an ideal workflow. I wanted my users to be able to just double-click their finished files. So, I wanted to add the type and creator codes into the exported MacPaint files from my Python program.</p>
<p>The problem was, the Classic Mac OS stored files in two separate sections, known as data forks and <a href="https://en.wikipedia.org/wiki/Resource_fork">resource forks</a>. It stored the type and creator codes in the resource fork. Almost every other operating system, including modern macOS, Linux, and Windows doesn’t have resource forks. Files are just a single blob. And my research was showing me that there would be no easy way to add a resource fork to my file for transport so that the Classic Mac OS would see it as one file. I needed a work around.</p>
<p>Of course tons of people had the same problem before. Classic Mac OS users had to work with people on other operating systems. So transport file formats were developed that could combine data forks with resource forks together in one file for transport and then “unbundle” them on Classic Mac OS so they could be used. The simplest and most common (other than the later developed .sit, <a href="https://en.wikipedia.org/wiki/StuffIt">Stuffit</a> archives, basically Zip files in Mac land), was <a href="https://en.wikipedia.org/wiki/MacBinary">MacBinary</a>.</p>
<p>Turning my MacPaint files into MacBinary files for transport with correct type and creator codes was as simple as adding a 128 byte header to the file in <a href="http://files.stairways.com/other/macbinaryii-standard-info.txt">MacBinary’s specified format</a>. This is still not a perfect solution, because the files need to be unstuffed by a program on the Classic Mac OS side that understands MacBinary before the MacPaint files can be double-clicked, but programs that understand MacBinary were common on the Classic Mac OS and include the aforementioned and ubiquitous Stuffit.</p>
<p>I got this all working in a couple nights for the book and then I thought, surely someone else must make a commercial MacPaint converter. The retro Mac community is pretty huge right now. But I couldn’t find any, other than the venerable <a href="https://www.lemkesoft.de/en/products/graphicconverter/">Graphic Converter</a>, which is a full-featured graphics program that I recommend (its creator, Thorsten Lemke, was actually gracious enough to let me conduct an interview with him for a research project in college back in 2006) but that costs $30. </p>
<p>I decided to make something lighter weight. Thus, Retro Dither was born. I ported my Python code to Swift. I added 4 more dithering algorithms (they’re all similar to implement). I built an AppKit frontend. I tested it. I tested the output files in emulators like <a href="http://sheepshaver.cebix.net">SheepShaver</a> for MacPaint 2 on Mac OS 9 and <a href="https://www.gryphel.com/c/minivmac/">Mini vMac</a> for MacPaint 1.5 on System 6. I did find a couple bugs, like that MacBinary expects each fork to be in exactly 128 byte chunks (I just had to fill extra space with some 0s). Even though later versions of Stuffit will ignore this, other MacBinary unbundlers like the built-in MacBinary command-line app on modern macOS and the original MacBinary program from the the standards authors in the 1980s will not (by the way, the modern macOS’s Archive Utility will unbundle MacBinary files).</p>
<p>I hope you enjoy <a href="https://oaksnow.com/retrodither/">Retro Dither</a>. And if you want to be made aware of my next Python book when it comes out, which will include the project described here, please <a href="https://tinyletter.com/kopec">join my very low volume mailing list</a>.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-81942523165662928382021-08-10T00:00:00.001-04:002021-08-10T00:00:12.782-04:00Apple Apologetics<p>The common criticism of the modern news industry is that objective journalism has been replaced by opinion-slanted proselytizing. There’s an interesting slice of the news world where proselytizing was never even at issue. I’m talking about the world of news sites, blogs, magazines, and rumor mills that cover Apple. </p>
<p>I’ve been reading news sites like MacNN (now defunct), <a href="https://www.macworld.com">MacWorld</a>, and <a href="https://www.macrumors.com">MacRumors</a> daily for more than two decades. I also enjoy more personal “news” and commentary blogs like <a href="https://daringfireball.net">Daring Fireball</a> and <a href="https://sixcolors.com">Six Colors</a>. And then there’s the journalists like <a href="https://twitter.com/markgurman">Mark Gurman</a> and <a href="https://twitter.com/Pogue">David Pogue</a> that at some point in their careers covered tech in an Apple-centric way for real news organizations like Bloomberg and the New York Times. There’s a cottage industry of journalists and outlets that make their entire living on the happenings of Apple Inc. Surprisingly, many of the specialized sites even managed to scrape by when Apple was <em>merely</em> a ten billion dollar company, and not the two trillion dollar behemoth it is today.</p>
<p>There’s an important assumption about the readers of these outlets. It’s assumed you’re a fan of the company. Why would you read MacWorld or a lot of what David Pogue wrote back in the heyday of his Apple fervor if you didn’t own an Apple product? But being a fan of Apple generally means more than being a user. In the 1990s when, as a kid, I first became a rabid Apple fan, it was known as a cult (in fact one of the news sites is still known as <a href="https://www.cultofmac.com">Cult of Mac</a>). Why were you using the non-standard products of this small struggling computer company with less than 5% marketshare? You had to believe in their products’ superiority or the potential of the company’s future despite the clear market signals to the contrary. You had to believe. It was a religion for techies.</p>
<p>That belief in Apple and its products has always been imbued in the outlets that cover the company. The fans demanded it. It was why we kept reading. We wanted our faith to be reinforced despite all of the contrary voices. Reading the news sites was like going to church. It made sense in the context of the ’90s. They were the underdog. It was fun and cool to root for the rebels. And the potential was there. If we could just keep them going with our collective enthusiasm, they could reach their true destiny.</p>
<p>But then they did. They became the largest company in the world. They came to dominate several slices of the tech industry. You’d think that would mean the coverage of them would change. Yet, the cottage industry that covered them never lost its fervor. It’s like the prophecy was fulfilled and now those who believed would go to heaven and be angels, rewarded for their faith.</p>
<p>And angels they are. Towards the company. The new presumption is no longer that some unrealized dream could be achieved when the right products arrive. The new presumption is that the company is a force for good. How did this transformation happen? It used to be about “could they deliver the long promised tech future.” It was about Mac vs Windows. For a while it was about iOS vs Android. Now it’s about social issues, battles with government, and court cases.</p>
<p>I think that we’re all looking for something to believe in. And many of us, including the “journalists” and commentators that cover Apple, are not finding it in the rest of our lives. Yet somehow our belief in this company during its dark times, against all odds, was right. And so we want to continue to believe our faith in it will be right again. Yet, today, we’re being asked to believe in something very different. A different company facing a different set of challenges in completely different spheres. I’m still a big fan, but I no longer take every leap of faith.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-72334555666564933062021-06-04T01:55:00.002-04:002021-06-04T02:10:51.747-04:00Book Review: Sid Meier's Memoir!<p>I’ve played far too many hours of <em>Civilization</em> throughout my life. If you haven’t, or you’re not an aspiring game designer, then you may find large sections of <a href="https://amzn.to/3fKWh7z"><em>Sid Meier’s Memoir!</em></a> hard to appreciate. But I do love Sid Meier’s games and I do dabble in making games as a hobby. So, I really appreciated this memoir that takes you through Meier’s entire career as well as some of his rules of game design that have made him so successful.</p>
<p>This book is not a deep dive. Each chapter, which generally covers a game or two, provides some insight about how a game was developed and why it worked (or did not work) for the player. But the chapters are short, and many of them concentrate on just one aspect of the game or Meier’s philosophy. The two things I found most interesting were the inspiration behind each game, and the gameplay rules that Meier learned over time. </p>
<p>It’s not a tell-all, and it doesn’t cover much about the video game business. You won’t get a play-by-play about the development of <em>Civilization VI</em>. Meier says that he left much of the business side to his partners. Instead, this is a book about the creative process.</p>
<p>Meier touches on enough of his personal life to give you a general outline of his life and some of the real-life hobbies that led to some of his best games. Again, most of the details are left out, but there’s enough there to be inspiring. The thing I found the most surprising in the entire book, is that despite his high position, Meier continued to be an active participant in the programming of his games (or at least the prototypes) late into his career.</p>
<p>In short, <em>Sid Meier’s Memoir!</em> is limited in its scope. It’s mainly about game design and the creative process. But it does that well. You won’t quite feel like you’re in the trenches with the team making <em>Civilization</em>, but you will feel like you have a sense of where their head was at. The lessons about game design and the creative process that Meier provides are drawn from deep experience and most seem self-evidently true. The writing is clear and the insights are real. If you loved his games or you want to make games, you should read this book.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-26638521220081312682021-02-27T01:24:00.002-05:002021-02-27T01:38:53.659-05:00Book Review: No Filter<p>Instagram is one of the most important cultural phenomenons of the 2010s. <a href="https://amzn.to/3q02CxG"><em>No Filter</em></a> by Sarah Frier covers Instagram’s rise from a two-person startup to the second largest social network in the world. Along the way, Frier explores Instagram influencers, the network’s effect on teens, and its sometimes rocky existance within the confines of its parent company, Facebook. <em>No Filter</em> is competently written and it seems Frier had significant access to the important players. Yet, the narrative lacks a compelling spark, and despite the access, fails to reveal much insight beyond what is already well known about the company.</p>
<p><em>No Filter</em> is written in the “anonymous amalgamation of interviews” style of other recent hit business books like <a href="https://amzn.to/3pUPwSF"><em>Hatching Twitter</em></a> and <a href="https://amzn.to/3uE748Y"><em>Console Wars</em></a>. This means that the interview source of each bit of original reporting in the book is not directly revealed in a footnote or endnote. This is not only problematic for the book as a historical document, it also means the reader is not aware of who’s bias is tilting a particular anecdote. This style can be partially justified if it leads to a more compelling narrative. However, while I found <em>Hatching Twitter</em> and <em>Console Wars</em> to be page turners, I didn’t feel the same way about <em>No Filter</em>. It may just be that Instagram’s corporate history is not particularly exciting compared to Twitter or Sega, but I also think it had to do with the way the book is structured.</p>
<p>The narrative is somewhat abruptly interrupted halfway through to spend a couple chapters on Instagram’s cultural effects, and the people who make their living through the app. Although I am not a regular user of Instagram, I was already aware of basically all of the material in these chapters just from loosely following the news and the cultural zeitgeist surrounding the company. I didn’t feel these chapters added enough value to be worth the interjection during what should have been the heart of the book.</p>
<p>Like many business books written by journalists about software companies, <em>No Filter</em>’s coverage of the technical aspects of Instagram is inadequate. Instagram co-founder/CTO Mike Krieger’s technical leadership is praised, but the reader does not get a sense of what kinds of technical decisions he really made that were successful. What technical hurdles did Instagram face as it scaled? How did they solve them? This is ultimately the story of a piece of software and part of its success is due to the engineering of that software. That angle deserved better coverage.</p>
<p>Speaking of Mike Krieger, we don’t get to know him very well in <em>No Filter</em>. In fact, the only people we get a strong sense of, are Instagram co-founder/CEO Kevin Systrom and Facebook CEO Mark Zuckerberg. It’s like a book about the early days of Apple that talks about Steve Jobs, but only scratches the surface with regards to Steve Wozniak. Okay, Mike Kriger might not quite be a Steve Wozniak, but he probably deserved a few more pages.</p>
<p>Frier does a very good job with Systrom, though. The reader gets a strong sense of his personality. Frier plays up the battles and contrasts between Systrom and Zuckerberg very well. We come to understand that some of the decisions made at Facebook surrounding Instagram were personal, and others were based on the very different characters running the two social networks under the same roof.</p>
<p>When you add up the “influencer” chapters and the lack of character development for many of the players, <em>No Filter</em> starts to feel like a relatively short book. Yes, Instagram is not a very old social network, but given the author’s access, there was surely more to be revealed. I wanted more business, technical, and character narrative and less filler.</p>
<p>Ultimately, <em>No Filter</em> is not a bad book. If you want a cohesive 300 pages about Instagram, you will get it. It’s just a bit of a bland book. It may be that Instagram’s corporate history is not that exciting. Or, it may be that the author missed some opportunities. Either way, I commend Frier for taking on Facebook, a powerful entity in our society that deserves further examination. And her portrayal of the relationship between Kevin Systrom and Mark Zuckerberg was very well done.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-72035320003824514952021-01-29T22:27:00.001-05:002021-01-29T22:27:07.364-05:00Book Review: Ghost In the Wires<p>Surprisingly, for a memoir about a guy who spends most of his time sitting in front of a computer, <em><a href="https://amzn.to/3afHI8f">Ghost in the Wires: My Adventures as the World’s Most Wanted Hacker</a></em> is a gripping thrill ride. And it’s a testament to Kevin Mitnick and his co-author, William Simon, that it works. In the wrong hands, the same material could easily be boring or overly technical. They found the right balance of action, technical detail, and non-hacking content to keep the story engaging. The book gives you a real sense of the hacking underworld, as well as how surprisingly easy it is to social engineer individuals, companies, and government agencies.</p>
<p>The most surprising part of the story is how little of Mitnick’s exploits were due to what we traditionally think of as computer hacking, and how much was due to social engineering. Mitnick learned to be a master manipulator, and in this book he explains to you how he convinced cops to turn over records, trusted employees to send files to people they just met, and just about anyone to do anything over the phone. If you want to better protect yourself from social engineering, this book is a great primer. It really makes you think about how quick we are to trust someone with a bit of confidence when they know a couple details we assume they would only know if the confidence were warranted.</p>
<p>Mitnick manages to make himself relatable. By including personal details, descriptions of family life, and imagery of his surroundings, he comes across as a regular guy. He compares his hacking activities to an addiction. I can almost buy that. He was getting notoriety, solving interesting puzzles, and probably feeling the same kind of rush that cleptomaniacs feel. It sounds like it could easily become a compulsion if you’re good at it and don’t have a certain moral wavelength turned on.</p>
<p>And I say that last sentence carefully. Because Mitnick (as far as I know and he claims in the book) never did anything especially damaging compared to some of the other well known hackers. He says he wasn’t in it for money or to do harm, but instead to satiate his curiosity. A significant portion of the book concentrates on this fact, and how the media played up his story to make him sound a lot more evil than he deserved. And that apparently affected his prosecution by the government. John Markoff, a well known New York Times reporter at the time, is singled out for particularly incredulous stories.</p>
<p>Yet, my biggest criticism with the book, would be Mitnick’s lack of sympathy for his victims. He spends a lot of time emphasizing how little damage he did, and almost no time apologizing for the damage that he did do. Sure, he may not have sold the source code he stole for a profit. And sure, the people he tricked mostly just had their time wasted. He didn’t actively try to ruin anybody’s life. Yet, mitigating his “work” inevitably cost companies and individual a lot of time. Employee time is money. It probably cost taxpayers millions of dollars investigating, trying him, and catching him. His exploits made people feel unsafe and caused them emotional distress. And he doesn’t seem very sorry. For that reason, I found him especially difficult to root for during the early chapters. Even his “pranks” as a teenager sometimes seemed mean spirited if I were to be on the receiving end of the frustration they caused.</p>
<p>In the end, though, Mitnick won me over. I found his relationship with his mother and grandmother endearing. I think the way he turned his life around after getting out of prison the last time is remarkable. It seems he’s done a lot of good the last twenty years. He’s an example of why people deserve a second chance, and his book is an interesting examination of social engineering and the media-legal system complex.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-87526768739297591792021-01-10T01:47:00.001-05:002021-01-10T01:47:20.557-05:00The Web Has No Design Standards<p>A reader recently complained to me about the hyperlinks on this blog. The reader thought the links were too hard to distinguish from the rest of the text. And the reader’s right. The Swedish Greys desktop theme that I thought looked cool eight years ago, while attractive in an aesthetic sense (to me at least), is not the most usable or accessible. I’ll be looking for another theme.</p>
<p>I was able to style my blog however I wanted to and it looks the same in all browsers. That’s the flexibility of good HTML/CSS standards. Every site can look and behave exactly as the creator envisioned. It’s also why the Web’s a usability nightmare. We have to learn to use every site we visit because every site is designed differently. How come when we talk about Web standards the focus is almost entirely on technical standards? Where is the worry about design standards?</p>
<p>I recently finished reading the classic book <em><a href="https://amzn.to/2JZgkSD">The Design of Everyday Things</a></em> by Don Norman and it talks about standards. Normans says “When all else fails, standardize.” Basically when you have no other way of implementing good design, you turn to standardization so at least every user only needs to learn how to use the similar things (in this case web pages) once. And I think we have no other way, because if we did, we would have figured it out in the past 30 years.</p>
<p>It wasn’t always this way. I remember using the pre-CSS and pre-JavaScript Web as a little kid on Mosaic. You knew there that the blue underlined text was always a hyperlink. And you knew that the back button always took you back a page. And you didn’t have to worry what different actions buttons did, because there was no JavaScript. I’m not saying we should go back there, but in many ways having the constraints made pages easier to use. There was no need to think. Now we have no constraints, but that’s why we need standards.</p>
<p>Every other major consumer computing platform but the Web has design standards. Apple’s platforms are famous for their Human Interface Guidelines. They are an attempt to ensure all apps follow some standard design conventions. Not every app does, but Apple has some ability to enforce them through its app stores, and some users even demand developers follow them. So, they are at least kinda sorta followed by most major apps. If the Web had design standards, maybe users would demand developers follow them too. Google and Microsoft have design suggestions and guidelines for their developers. This is why a good app for each platform feels “at home.”</p>
<p>But we have no design guidelines for the Web that are widely accepted. Sure, people have tried. But the only way we’re going to get something that’s actually followed is if we have a standard. And a standard needs to come from a standards body (Apple, Microsoft, and Google are the standards bodies for their respective platforms). W3C, please put some focus on a design standard. Not everybody will be forced to follow it, but it could do a lot of good in terms of usability.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-9185441246516323392021-01-05T15:24:00.001-05:002021-01-05T15:24:20.045-05:00Classic Computer Science Problems in Java is Published<p>I am pleased to announce that my fourth book, <em>Classic Computer Science Problems in Java</em>, has been published. It is <a href="https://www.manning.com/books/classic-computer-science-problems-in-java?a_aid=oaksnow&a_bid=6430148a">now available for purchase from the publisher’s website</a>. As Manning’s deal of the day, the book is available today (January 5, 2021) for 50% off. </p>
<p><em>Classic Computer Science Problems in Java</em> is a continuation of the Classic Computer Science Problems series, with previous incarnations in Swift and Python. They teach problem solving techniques from the realm of computer science in an approachable code-centric tutorial-like fashion. They are relatively light on theory and heavier on analogies, examples, and code. You don’t need a computer science education to pick up the books. In fact they were designed with self-taught programmers in mind. You do need to be at least an intermediate programmer. You can find out more about the contents of the series at <a href="https://classicproblems.com">classicproblems.com</a>.</p>
<p>The Java book follows the success of <em>Classic Computer Science Problems in Python</em> which has sold more than ten thousand English copies and has been translated into eight other human languages including Portuguese, Simplified Chinese, German, Russian, Polish, Korean, Traditional Chinese, and Japanese. Beyond the three original book programming languages, the source code has been <a href="https://classicproblems.com/#code">ported by the community into five additional languages</a> including Go, C++, Ruby, PHP, and JavaScript.</p>
<p>I don’t know if the Java book will be as successful as the Python book, but I do know that there will be a lot less readers upset about the inclusion of type annotations. Manning provides a short <a href="https://livebook.manning.com/book/classic-computer-science-problems-in-java?origin=product-look-inside">free sample of the book on their website</a>, so you can check it out before you buy. Let me know if you have any questions on Twitter. I’m <a href="https://twitter.com/davekopec">@davekopec</a>.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-89379116751645324242020-12-26T14:06:00.001-05:002020-12-26T14:06:55.091-05:00Book Review: The Presentation Secrets of Steve Jobs<p>I give a lot of presentations. As a college instructor, I present at least once every week, and usually multiple times. I’ve also presented in business contexts and to general audiences. <a href="https://amzn.to/38E0uVQ"><em>The Presentation Secrets of Steve Jobs: How to Be Insanely Great in Front of Any Audience</em></a> by Carmine Gallo caused me to rethink how I’m delivering my content. I had seen every Steve Jobs video available online, including all of his keynotes, before reading the book. But it took Gallo’s insights to distill what made Jobs’s presentations so great in a digestible form that I could use.</p>
<p>Gallo’s book is based on the premise that Steve Jobs’s presentations were excellent. If you don’t agree with that and you didn’t like his style, then don’t pick up this book. You can watch any of Jobs’s presentations on YouTube. And if you haven’t, I highly recommend watching some of the most famous ones (introduction of the iPhone for example) before picking up the book. They will give you context because Gallo refers to specific presentations in just about every chapter. In fact, if you haven’t seen them, you may want to watch them as they’re introduced in the book, although it will add many hours to your reading experience.</p>
<p>Most of Jobs’s presentations featured slides. Therefore a significant amount of the advice in the book relates to making slides. If your presentations don’t involve slides, you will find about one third of the book’s content not applicable to you. Jobs’s slides were very different from most of the slides we see in business and academia. They had almost no text. Gallo clearly explains how Jobs made this work</p>
<p>Much of the non-slide advice is common sense: practice, vary your use of voice, be passionate when presenting, use demos, break up your presentation, etc. Yet the combination of all of it into a single volume and the way that Gallo elucidates these points make the book a one stop shop for improving your slides. I never got bored reading this common sense because I love Steve Jobs and even though I already knew almost all of the anecdotes in this book, they really made the advice come alive. If you don’t know much about Steve Jobs then you might not find the book quite as exciting.</p>
<p><em>The Presentation Secrets of Steve Jobs</em> is a great book to improve your presenting skills, especially if you make presentations with slides. Its advice about making slides is unconventional and will make you rethink how you do them. Its other advice is mostly common sense but is really well illustrated. If you’re not familiar with Steve Jobs or you have not watched his keynotes you should watch some of them either prior to reading the book or simultaneously with when they are presented in each chapter. If you don’t like Steve Jobs/Apple then this is not a book you will enjoy.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-5135121381579151552020-12-23T10:47:00.002-05:002020-12-23T11:06:58.243-05:00Book Review: Edison by Edmund Morris<p>Thomas Alva Edison is almost inarguably the greatest inventor of all time. The first device for recording and playing back sound, the first large scale power distribution system, the first practical light bulb, and the first commercially successful video recording and playback device were just a few of his numerous inventions. His inventions span the gamut from mining, to electricity, to chemistry, to telecommunications, to optics, to mechanics, and even to botany. Edmund Morris’s <a href="https://amzn.to/2JbAk44"><em>Edison</em></a> is an excellent book by a very experienced biographer that takes you through every one of Edison’s major inventions with enough context to help you understand how and why they came about. But Morris made a very strange structural decision that, while interesting, takes away from the book’s enjoyment.</p>
<p>Morris’s biography dispels two myths that I had heard about Edison (having only previously read a dime store biography of him and a book about his movie production company). The first is that Edison doesn’t deserve credit for his inventions because it was his workers who really came up with most of them. It’s clear from this meticulously sourced biography that Edison was not only the visionary behind his inventions, but that he also had a thorough scientific knowledge that allowed him to work hand-in-hand with his workers, directing them at every step. This is all the more amazing since he had no formal education and was thoroughly a self-made person. Edison was incredibly studious and consumed volumes and volumes of both scientific and non-scientific literature. Most of his major inventions really were his ideas. Some of them were improvements on the work of other inventors, and some of them were co-invented with his workforce, but he was the indispensable figure who created the first industrial research laboratory, making this all possible and directing it meticulously from his own mind.</p>
<p>The second myth I had heard about Edison is that he was a good scientist but a terrible businessman. It depends what you mean by “businessman.” Morris makes it clear that Edison was poor at managing his finances. But what is also clear from Morris’s account is that Edison was an amazing entrepreneur. He was able to see what inventions had practical commercial potential. He turned ideas into money. Did he then subsequently run those businesses well? Not generally. He was a great entrepreneur, but not a great manager.</p>
<p>Beyond invention, Edison’s life was filled with serendipity, interesting personal stories, and meetings with the greatest figures of his generation. Morris spends about three fourths of the biography on Edison’s inventions and business pursuits, and the remainder on the rest. He was perhaps the most famous person alive during his lifetime, and for good reason—his inventions utterly changed the every day lives of the masses. Reading the biography, you will get a sense of this, but it’s not delved into in any great detail. The majority of the pages are spent on the inventions. </p>
<p>The explanations of the inventions are clear enough that you do not need a scientific background to understand the gist of their purpose. You won’t understand them at a fundamental level, but you will understand why they were important and how they connected to the rest of the Gilded Age world. There’s not room, even in eight hundred pages, to go into all of Edison’s inventions, nor all of his personal life. His journey was just that amazing. But you get a sense that Morris chose the important highlights well.</p>
<p>So, <em>Edison</em> is a well-written and balanced biography about one of the most interesting figures of all time. What is not to like? The structure. Morris chose to bizarrely present Edison’s life in reverse chronological order. Each chapter covers a decade of his life. And the book starts with his last decade, and ends with his first. As we all know, lifetimes progress linearly. We’re used to hearing stories in order. It’s hard to keep track of characters, when we are abruptly and repeatedly thrown back ten years in their lives. The result is that it’s very hard to keep straight the lives of Edison’s associates and family members as you read <em>Edison</em>. It’s interesting in the last two chapters, knowing what you know about his life, to hear about how it started. It’s interesting, but I don’t think the trade off was worth making the rest of the book harder to read and keep track of. Morris died about five months before <em>Edison</em> was published. I wonder if he had lived longer, if he would have rethought the structure upon further reflection. Some reviewers have suggested reading the book backwards. I don’t think it would hurt you much to do this.</p>
<p>Thomas Edison was an amazing, interesting, and world-changing figure who deserves a thoroughly researched extensive biography by a great writer. In <em>Edison</em>, we have that. Its bizarre structure notwithstanding, if you are at all interested in technology, business, or even just history, you should give <em>Edison</em> a read.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-31807619040615932402020-12-16T05:46:00.001-05:002020-12-16T05:46:14.361-05:00Book Review - No Rules Rules: Netflix and the Culture of Reinvention<p><a href="https://amzn.to/3nuWlKk"><em>No Rules Rules: Netflix and the Culture of Reinvention</em></a> is not a history of Netflix. It’s an extended account of the corporate values that have resulted in Netflix’s success as told by its cofounder/CEO Reed Hastings and accomplished business writer & academic Erin Meyer. This well written and clearly explained book offers insight into managing a creative company using non-traditional management techniques that give employees greater freedom and responsibility. However, the techniques are likely not as widely applicable as the authors imply. </p>
<p><em>No Rules Rules</em> follows a unique format, in which each author’s voice is clearly pointed out in their sections of each chapter, leading to a kind of dialogue between the two. This format creates balance. Each point is discussed from the insider/pragmatic perspective of Hastings and the more academic perspective of Meyer. Meyer will sometimes backup Hastings’s assertions with research outside of Netflix, or gently pushback against some of his more absolutist tendencies. Meyer appears to have had significant access to employees throughout Netflix while doing her research. However, there’s no section in which she completely disagrees with Hastings, and throughout most of the book the reader is simply getting the same point from multiple perspectives.</p>
<p>The book revolves around the benefits of a corporate culture that empowers individual contributors to make decisions without bureaucratic tape and draconian oversight. This is meant to increase efficiency, improve flexibility, and help employees feel more satisfied with their roles. A couple specific examples are employees deciding for themselves the appropriate amount of vacation to take each year (no vacation policy) and signing contracts without getting approval from their managers. To get to this place of what the book calls “freedom and responsibility” there are certain prerequisites defined by the authors. These include a culture of candid feedback and achieving a high “talent density.”</p>
<p>These corporate values have obviously served Netflix well, but they may not quite be the panacea they seem from reading the book. Unfortunately, despite Meyer’s involvement, the values are somewhat myopically presented within the confines of Netflix. Probably the most controversial point in the book is its assertion that “adequate” employees (sometimes interchangeably referred to as “good” employees) should be let go to make room for hiring “great” employees. This is presented rather uncritically, without the obvious introspection that it is easy for an industry leading organization like Netflix to have its pick of “great” employees waiting at the gates to get an opportunity to work for it when they let go of the “good” employees.</p>
<p>The authors only caveat is that safety or process oriented companies (think nuclear reactor or industrial manufacturing) cannot risk freedom and responsibility. Yet, there are many other creative types of companies that cannot fulfill the prerequisites outlined by <em>No Rules Rules</em>. For example, there are creative companies that due to the limited profits in their industry cannot pay top-dollar and cannot risk letting go of “good” employees because there will be no “great” employees waiting to take their place.</p>
<p><em>No Rules Rules</em> is a good book for learning more about Netflix, how its corporate culture works, and how it has helped to make it successful. It’s sprinkled with enough interesting anecdotes and good writing to keep your attention. The unique format adds value and the non-traditional management techniques are interesting and surely have some merit. Yet, the book’s failure to acknowledge the unique circumstances of Netflix that make its unique culture possible, stop it from being a “great” book. It’s just a “good” book.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-46084308432659359942020-11-15T00:37:00.003-05:002020-11-15T00:37:53.819-05:00On Taking Criticism<p>I am what I would call a non-famous public person. What do I mean by that? I mean that I have jobs where people publicly review my work. As a college instructor, I receive student reviews. Some of them get read internally at our school, and some of them get posted publicy. And they’re attached to my name. They’re not some product where people might just know my company or my brand. They know <em>me</em>, and they’re reviewing <em>me</em>. As an author, my books get reviewed. Some of those reviews are by editors and official reviewers internal to the publisher. Some of those reviews are by email. But most of those reviews are posted online. As a software developer and hobbyist podcaster I also get public reviews.</p>
<p>To anyone in a personalized creative field who cares deeply about their work, bad reviews hurt. It’s not just about being sensitive (although I am sensitive and that doesn’t help). It’s that when you really pour your heart into something, as I do my teaching for example, then the product is an extension of you. Nobody would deny that the way a class or a book turns out is an extension of the personality, knowledge, and ability of the teacher/author. And when the product is criticized, it’s like you are being criticized. </p>
<p>My dad, who was also a college instructor, and the producer of nine books and nine instructional videos among many other public creative ventures, had a very thin skin. He couldn’t stand me reading him a bad review. That stuck with me. This very accomplished man, couldn’t stand even a little criticism. When I get too sensitive, I try to remember how his inability to accept criticism hurt some of his products. He was much more about getting things done than doing them perfectly. If he had a little bit more of a perfectionist streak in him, he would have done even better. But maybe he would have done less…</p>
<p>It doesn’t matter if I receive eighteen great reviews for a class. It’s the words of the two bad reviews that stick with me. And do you know why? <em>Because almost always there’s a kernel of truth to those reviews.</em> Does that mean we should listen to them? Well if I only listened to the bad reviews, I would never produce anything. I would just stay in bed. The fact is the people who are getting no bad reviews, are the people who are not taking the risk of putting themselves out there. So, we have to not let ourselves get so discouraged that we stop producing. And we have to remember that while we may not have served those two students well, we may have served those other eighteen students better than they would have been served in a world without us teaching them. </p>
<p>We can’t please every student or every customer. Nothing that gets watched/read by more than a few people is going to be liked by all of them. Even Mother Theresa would get a downvote on YouTube. So, if we’re serving the majority, we don’t want to let the critiques of a few steer us in the wrong direction.</p>
<p>On the other hand, being like my dad is dangerous too. <strong>No, the customer is not always right. But usually the customer has a point. We have to always be working to get better.</strong> Because we’re not perfect, and there’s always room for improvement. <strong>And we need to read those bad reviews to find those spaces for improvement.</strong> It doesn’t mean they’re right, but it does mean we need to think about them.</p>
<p>My dad accomplished an amazing amount. If he let those bad reviews slow him down too much, it’s very possible he would have not accomplished as much. But if he could have found a few tweaks, a few changes, to serve a few customers better, well then he could have grown through them. I want to grow, but I also don’t want to stop. So, I can’t let the reviews get me too down, but I have to read them.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-43555026944852051472020-10-17T22:31:00.001-04:002020-10-17T22:31:06.479-04:00Book Review: Let It Go by Stephanie Shirley<p>A child refugee builds the first wholly female software company, putting feminism into practice, and goes on to become one of the most noted philanthropists in her country. It’s a story fit for Hollywood. Stephanie Shirley tells it with gusto, raw honesty, and compelling writing in her autobiography, <a href="https://amzn.to/3lV1A4C"><em>Let It Go</em></a>.</p>
<p>As a half-Jewish child during the beginning of World War 2, Shirley was saved from the horrors of Nazism by escaping on a train as a child refugee. In England she would build a new life, and build a software consulting company. Freelance Programmers (later F International) employed female programmers who were under-appreciated and discriminated against by the business world at the time. Many of these women worked from home part-time or while raising children in a world that wouldn’t allow them to work otherwise. They would work on large technical projects for some of the largest companies in Britain. <em>Let It Go</em> is a strong feminist treatise drawn from reality, not abstractions.</p>
<p>Shirley was a pioneer in many ways. Creating a software company in and of itself was still a new idea in 1962 when she got started. Creating a company of freelancers decades before “the gig economy” was an innovation. Employing almost all women in a technology company (although women were many of the first programmers) was unheard of. In <em>Let It Go</em> Shirley takes you through the early struggles of building Freelance Programmers. The reader receives a strong understanding of how the company operated, how it acquired clients, and the challenges that it faced as it grew from her cottage into a multi-million dollar enterprise. While Shirley covers the early period in the right level of detail, the company’s later growth is not as well recounted in the book.</p>
<p><em>Let It Go</em> is also a deeply personal book. Shirley goes into detail about her relationships, her family life, and her struggles taking care of her child, Giles, who is affected by a severe form of autism. She weaves the personal stories well into the business narrative, making it a more “full picture” story than most business books. Her personal life affected her business and vice versa. That’s true of almost anybody, and to think otherwise is a folly. Yet many business memoirs almost completely exclude personal details.</p>
<p>One of the things I appreciate most about <em>Let It Go</em> is that Shirley held nothing back. Even embarrassing or difficult details were not left out. If she felt jealousy or betrayal over a colleague’s actions, she explained it. She covered her mental breakdown. She covered marriage difficulties. She covered her fraught relationship with her parents. It was real. It was raw. And it made for a more realistic, interesting, and insightful journey.</p>
<p>The latter half of the book deals primarily with three topics: Shirley’s transformation of her company into a partially employee-owned operation, her struggles to help her son with his condition, and her philanthropy. Shirley ended up being a leading figure in philanthropy in Britain, and in autism philanthropy in particular. She founded a school for children with autism, the country’s largest autism charity, and too many other philanthropic initiatives to mention here. </p>
<p>The theme of the book can be seen as “relinquishing control,” hence the title <em>Let It Go</em>. Shirley ultimately let go of her personal tragedies, her business, and many of her philanthropic ventures (to other managers). And she sees them as more successful as a result of it. It’s a powerful message that can only be fully understood by reading the book. If you have any interest in the early software consulting business, the evolution of autism care, women working in technology, or just want to read a great life story, <em>Let It Go</em> is worth your time.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-36847851007324704882020-08-24T01:00:00.001-04:002020-08-24T01:00:50.583-04:00Book Review: Blood, Sweat, and Pixels<p><a href="https://amzn.to/3hApsZm"><em>Blood, Sweat, and Pixels: The Triumphant, Turbulent Stories Behind How Video Games Are Made</em></a> by Jason Schreier is a compilation of vignettes about the development of ten different video games. Many of the games are RPGs, and most of them are produced by large studios. Despite the many different accounts, there is a real lack of diversity in the stories. Almost all of the stories deal with the same themes: crunch (working large amounts of overtime to ship a game), overcoming mismanagement from above, and reworking stories/gameplay that are found in development to be lackluster. The stories can therefore seem repetitive, despite being generally well written with a great degree of access to the original developers. The vignettes are too short to let the reader dive into the finer aspects of each game’s development, and it is hard to feel connected to the many introduced characters.</p>
<p>Although many of the ten stories feel repetitive, there are a few gems that stand out. The story of Eric Barone developing Stardew Valley by himself over five years was perhaps the most interesting, and is almost worth picking up the book for alone. It deserved more than just one chapter. Because it focused on just one person, it was able to better weave together the game and the personal story. Which really highlights the problem with the book as a whole: it tries to cover too many stories, and therefore ends up giving every story too little space. Schreier seems to have had excellent access to the developers, but this access was squandered by being so scattered.</p>
<p>Another strong chapter in the book is on the development of The Witcher 3. Schreier covered the interesting corporate history of developer CD Projekt, who’s unique foundation and Polish roots made for some less humdrum reading than many of the other large studio stories. The story of Yacht Club Games and Shovel Knight was the lone other indie chapter beyond Stardew Valley. Like Stardew Valley it was one of the more interesting chapters because it had fewer characters to keep track of. The book would have been better if it were ten chapters on five games, instead of ten chapters on ten games.</p>
<p>There is also a distinct lack of focus on overcoming technical hurdles and the software development/programming that goes into making games. The book focuses a lot more on game design and creative decisions, rather than technical work. Aspiring game programmers may come away disappointed. And by leaving this huge aspect of game development largely out of the book (there are some chapters that mention it, but without any level of detail), I feel the author did not fully represent the development process. On the other hand, not getting too technical probably made the book more appealing to a broad audience. </p>
<p><a href="https://amzn.to/3hApsZm"><em>Blood, Sweat, and Pixels</em></a> is an ambitious book that falls short of its lofty goal. It is probably best read piecemeal, picking and choosing the stories that interest you most. However, the author deserves credit for taking on such a challenging task, getting real access to the pertinent parties, and giving the reader an inside look at game development despite some poor editorial/structural decisions. </p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-74472652593965345762020-07-09T19:21:00.001-04:002020-07-09T19:21:35.186-04:00Announcing Classic Computer Science Problems in Java<p>I am pleased to announce the availability of my fourth book, <em>Classic Computer Science Problems in Java</em>. <a href="https://www.manning.com/books/classic-computer-science-problems-in-java?a_aid=oaksnow&a_bid=6430148a">You can now purchase early access to the book from Manning</a>. Use promo code <strong>ccspkopec</strong> for 40% off. This is the third book in the Classic Computer Science Problems series, following <em>Classic Computer Science Problems in Swift</em> and <em>Classic Computer Science Problems in Python</em>. You can find out more about the series at <a href="https://classicproblems.com">classicproblems.com</a>. The manuscript is complete but it is being rolled out in chunks for reader feedback over the summer. Hopefully, the final version will be in print by the end of the year. </p>
<p>The books are aimed at intermediate programmers who want to delve deeper into the covered problem solving techniques, brush up on core algorithms, or learn more Swift/Python/Java using problems familiar to them from other languages. They are suitable for professionals looking to deepen their understanding of the covered topics, students with some programming background looking to expand their computer science knowledge, and anyone preparing for coding interviews.</p>
<p>What is a “Classic Computer Science Problem?” It is a problem one typically finds in an undergraduate computer science curriculum. The topics covered in the books span the gamut from core computer science algorithms you would find in a data structures & algorithms class to artificial intelligence and its sub-discipline machine learning. There are both practical and whimsical problems. They include classic search problems, constraint satisfaction problems, graph algorithms, genetic algorithms, k-means clustering, simple neural networks, and more!</p>
<p>They’re meant to be approachable broad books, not deep books. They’re not textbooks. They’re hands on code-centric tutorials to pique your interest in the many topics covered.</p>
<p>All of the code in the most recent book is <a href="https://github.com/davecom/ClassicComputerScienceProblemsInJava">available on GitHub</a>. The book takes advantage of features up to version 11 of the Java language. The code only uses the Java standard library throughout, so there’s no wrestling with third-party libraries. You will learn how to solve all of the problems in the book “from scratch” so that you gain a deeper understanding of how each problem solving technique works under-the-hood.</p>
<p>To learn more, <a href="https://www.manning.com/books/classic-computer-science-problems-in-java?a_aid=oaksnow&a_bid=6430148a">checkout the Classic Computer Science Problems in Java page on Manning’s website</a> where you will find a full table of contents and temporary free access to small portions of the book. </p>
<p>We decided to bring the book to Java (a language close to my heart because I first learned it as a teenager over 20 years ago and have worked professionally in it), because the Python version has been a huge success. It has sold many thousands of copies and has been translated into eight human languages in addition to the original English. The Swift version did only moderately well, so we are excited to bring the book to another mainstream language audience. We try to be careful to make sure each version uses best practices in its respective language, but I would love to hear your feedback about the Java version during the early access period for any ways we can improve on our use of the Java language. </p>
<p>Remember that you are purchasing a pre-release version of the book, so you will be joining me on the journey to its final release in the fall. You will be receiving rough drafts of chapters before they have been fully vetted. I encourage you to send me your feedback, but keep-in mind that these are early days and everything is not yet perfect. You will receive the final version of the book upon publication.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-77501481704099595472020-06-21T15:33:00.001-04:002020-06-21T15:33:22.168-04:00Updating the Declaration of Independence<p>The <a href="https://www.archives.gov/founding-docs/declaration-transcript">Declaration of Independence</a> is considered to be one of the most important documents in human history. Not only was it the seminal document in the political formation of the United States, it also was arguably the first time that a nation was expressly formulated with an understanding of the essential nature of human rights, despite not living up to it. It <a href="https://en.wikipedia.org/wiki/United_States_Declaration_of_Independence#Influence_in_other_countries">inspired many more rebellions</a> against tyranny around the world in places as far removed as Vietnam and Haiti, and continues to inform our understanding of the relationship between a people and their government.</p>
<p>However, while its syntax is beautiful, it also no longer rings true to everyone who reads it. This is both because of our updated understanding of who political rights should be applied to (all human beings), and because not every reader is familiar with the assumptions and meanings inherent in the eighteenth century English of its writers. <em>I don’t think we should literally update a historical document, but I do think it’s important to be clear about what the Declaration means to us today.</em></p>
<p>Here is the language in the Declaration’s most famous section:</p>
<blockquote>
<p>We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness.–That to secure these rights, Governments are instituted among Men, deriving their just powers from the consent of the governed, –That whenever any Form of Government becomes destructive of these ends, it is the Right of the People to alter or to abolish it, and to institute new Government, laying its foundation on such principles and organizing its powers in such form, as to them shall seem most likely to effect their Safety and Happiness. Prudence, indeed, will dictate that Governments long established should not be changed for light and transient causes; and accordingly all experience hath shewn, that mankind are more disposed to suffer, while evils are sufferable, than to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and usurpations, pursuing invariably the same Object evinces a design to reduce them under absolute Despotism, it is their right, it is their duty, to throw off such Government, and to provide new Guards for their future security.</p>
</blockquote>
<p>Here is my interpretation of the Declaration’s most famous section in the simplest language that can represent what it means to me in today’s context, and no simpler:</p>
<blockquote>
<p>We believe that all people should be treated equally under the law. There are universal human rights including, but not limited to, the rights to life, liberty, and the pursuit of happiness. Government exists to ensure these rights. Government’s only legitimate power comes from the people it governs. Governments that infringe on human rights or derive their power from a source other than the people, are illegitimate. It is the right and duty of people to replace such governments.</p>
</blockquote>
<p>This is my personal interpretation of the Declaration. This is what it means to me today. And it’s how I will parse it for my children. Maybe I have some details wrong and I’ve changed some of its intent. But I think the spirit is right and I think the language will be very easy for them to understand and contextualize for the modern world.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-19383757000398426072020-06-11T13:50:00.001-04:002020-06-11T13:50:29.422-04:00Building a Local Newsletter<p>One year ago, I launched <a href="https://btvdaily.com">BTV Daily</a>, a daily email newsletter that delivers news, events, top social media posts, and other items of local interest to subscribers in the Burlington, Vermont area. The newsletter is largely automated, although I write a short daily blurb in a section called “Dave’s Corner.” BTV Daily is a hobby, but one that I take quite seriously because it provides real value to its subscribers. I know this because for the one-year launch anniversary this week, I put out a subscriber survey, and I was impressed to find how many people really appreciate the newsletter. </p>
<p>This post contains details about how I built BTV Daily and how I’ve grown it from 0 subscribers to (a still fairly meager) 296 subscribers (as of today). Keep in mind that Burlington, Vermont is a city of just 40,000 people. Also, keep in mind that the newsletter is not (yet?) monetized. In fact, it costs me money. This is a passion project, not a business.</p>
<h2>Generating Content</h2>
<p>To see what a copy of the newsletter looks like, you can checkout the <a href="https://btvdaily.com/#archive">archive section</a> of the BTV Daily website. The sections in the newsletter are Weather, This Day in Vermont History, News, Events, Top Twitter Posts, Dave’s Corner, Latest SeeClickFix Issues, and Quote of the Day.</p>
<h3>Technical Setup</h3>
<p>BTV Daily is generated by a Python script that runs via a cron job on a Raspberry Pi in my home. At 7:45 AM each day, the Pi connects to GitHub to pull my latest blurb for Dave’s Corner. At 8 AM each day, the main script executes. It calls various APIs to generate BTV Daily’s content, which is amalgamated into an HTML file that is passed to MailChimp to deliver to our subscribers. I use no images in the newsletter to decrease load time and avoid being marked as spam. I do make extensive use of emoji instead. Unfortunately, I still get erroneously marked as spam by gmail’s spam filter for some users despite the fact that this is a subscribe-only newsletter (I don’t manually add any users).</p>
<h3>Weather</h3>
<p>The day’s weather information is generated using the Dark Sky API. An avid reader asked me to include sunset time in it, and I think that was a very nice addition. Apple has purchased Dark Sky, but their API will keep working through the end of 2021.</p>
<h3>This Day in Vermont History</h3>
<p>I added this section about halfway through the year after receiving permission from the <a href="https://accd.vermont.gov/historic-preservation">Vermont Division for Historic Preservation</a> to use their database (which they sent me as a Word document). This was, of course, very nice of them. I wrote a script to reformat the database into a Python dictionary.</p>
<h3>News</h3>
<p>When I first started BTV Daily, I used the RSS feed of The Burlington Free Press to generate the news content. However, much of the content from them is paywalled, and users complained. So, I moved to the Bing News API, which Microsoft provides a Python library for accessing. I carefully calibrated the local sources to request stories from, the keywords to use to get Burlington specific stories, and other settings. I also added the NY Times as a source, so that when Burlington is in the national news, relevant stories will come up. This did lead to some Bernie Sanders political stories making their way into the newsletter even though they were not really about Burlington (sometimes stories about him will mention his hometown of Burlington in passing).</p>
<h3>Events</h3>
<p>The newsletter links to Burlington area events from Seven Days, hopefully driving some traffic to this venerable publication.</p>
<h3>Top Twitter Posts</h3>
<p>I use the Twitter API to search for the top five tweets in the past 24 hours that have the most favorites that use hashtag #BTV or #BurlingtonVT. #BTV was unfortunately getting me tweets from non-Burlington sources, but I later discovered that the API has an option to limit searched tweets to a radius around a zip code. I use a 250 mile radius of Burlington and it works well.</p>
<h3>Dave’s Corner</h3>
<p>I write Dave’s Corner in a text file that is labeled by date in a format the script looks for. I can include HTML tags. I should probably put the work in to include markdown support. Occasionally, my wife will write a blurb and the section changes from Dave’s Corner to Rebecca’s Corner if the first line is “Rebecca.” My blurbs are usually observations about Burlington or my life.</p>
<h3>SeeClickFix Issues</h3>
<p>SeeClickFix is a tool for citizens to report local issues to municipal authorities. I have some concerns about the fact that people can be virtually anonymous on the site (they can act almost as a secret police). By exposing issues to the general populace through the newsletter, hopefully they are getting more scrupulous attention. I report the SeeClickFix issues of the last 24 hours via the SeeClickFix API. They are released under a non-commercial license. If I monetize the newsletter in the future, I suppose I may need to remove this section, or is it fair use?</p>
<h3>Other APIs</h3>
<p>I use the MailChimp API for actually sending the newsletter. I use the WikiQuotes API for generating a random local quote at the end of the newsletter. Unfortunately, the only non-political and non-controversial figures from Burlington on Wikiquotes are Ethan Allen and John Dewey. These quotes get pretty boring, pretty quickly.</p>
<h2>Getting Subscribers</h2>
<p>I got my first twenty subscribers through a Reddit post. I got another twenty or so subscribers by mentioning the newsletter on a Vermont email social network called Front Porch Forum. Several people in the one-year anniversary survey said I should post more about the newsletter on Front Porch Forum, but believe it or not the advertising rates on Front Porch Forum are exorbitant. And I don’t want to post regularly there without paying for advertising since that doesn’t feel right.</p>
<p>The rest of the ~300 subscribers have come through Bing ads, Facebook ads, Twitter ads, and word of mouth. I also tried a few physical advertisements on bulletin boards around the city. It ends up costing me about $1/subscriber when using Facebook/Twitter ads. I guess that’s my “customer acquisition cost.” Since this is a hobby project that I enjoy, I don’t mind that I’ve spent a few hundred dollars on it.</p>
<h2>Keeping Subscribers</h2>
<p>The vast majority of people who subscribe to BTV Daily stay subscribed. The numbers show that over the first year, about 80% of people who subscribe don’t unsubscribe. I try to be responsive to individual emails I get from subscribers. Several improvements to the newsletter have been a result of reader feedback. About 40–50% of subscribers open any given edition of the newsletter within 24 hours.</p>
<p>The vast majority of subscribers live in Burlington or one of the surrounding communities. Once in a while someone from out of state will accidentally subscribe and they will realize their mistake and unsubscribe. The most infuriating thing is when someone unsubscribes after being on the list for months and marks the reason to Mailchimp as “spam.” This happens rarely, but how can a newsletter that you personally signed up for and read for months be spam?</p>
<h2>Looking Forward</h2>
<p>I would like to add additional sections to BTV Daily. One section in particular that I am interested in adding is job postings in the Burlington area. I contacted Craigslist legal for permission two times, one year apart, and nobody got back to me. I applied to become an Indeed.com publisher almost a month ago and never heard back as well.</p>
<p>I would like to grow the newsletter to 1,000 subscribers (2.5% of the population of Burlington proper). I am thinking of showing a progress bar in the newsletter. Perhaps that would encourage subscribers to tell their friends. Or perhaps it would discourage them because they thought the newsletter had thousands of subscribers and it only has ~300.</p>
<p>If I reach the 1,000 subscriber goal, I may try to monetize the newsletter to at least cover its advertising costs by allowing people to place local ads. I would not be opposed to making a profit either! But it’s not my primary concern right now.</p>
<p>If you have questions or comments about the newsletter, feel free to reach out to me at newsletter at btvdaily dot com</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-5417996997583745422020-04-21T23:54:00.001-04:002020-04-21T23:54:05.767-04:00Book Review: Showstopper! The Breakneck Race to Create Windows NT and the Next Generation at Microsoft<p>I enjoy books about tech history and business. I also enjoy biographies. So, <a href="https://amzn.to/2ywdvm0">Showstopper!: The Breakneck Race to Create Windows NT and the Next Generation at Microsoft</a> by G. Pascal Zachary was a perfect fit for me. It has a compelling software business narrative, backed up by significant author access to the major players, and features non-stop action throughout most of the book.</p>
<p><em>Showstopper</em>, written in 1994, is a book about the building of Windows NT, one of the last still-in-use desktop operating systems to be developed from scratch (Windows NT remains the underpinnings of Windows 10). Zachary had incredible access. He was able to interview all of the major players involved in NT development, including David Cutler, the project’s lead, and Bill Gates, the CEO of Microsoft at the time. It provides real insight into the market landscape at the time, the challenges that Windows NT faced, and what is was like for regular software developers and management to laboriously crank out NT over many sleepless nights throughout a period of roughly four years.</p>
<p>Zachary does a good job balancing vignettes about management with vignettes covering lowly software developers, testers, and their families during development. He pays attention to the human story. What was the toll of the breakneck development schedule and the high pressure environment on families and worker mental health? He clearly did his research, took the time to interview everyone relevant that was involved, and weaved their respective narratives into a cohesive largely chronological whole.</p>
<p>Where <em>Showstopper</em> falls short is in Zachary’s understanding of the technology. While seemingly written for a mainstream audience, I imagine most readers today, like me, will be software developers. From the beginning it was clear to me that Zachary did not fully grasp all of the software development technology that a book like this inevitably needs to cover. Or if he did, he dumbed it down too much for my liking. He did his best, and I think if I were a mainstream reader, his explanations would actually be quite good: just enough to give me a basic understanding. But as a software developer, I was left wanting.</p>
<p>The parts of <em>Showstopper</em> I liked least were the first thirty pages, largely covering Cutler’s career at Digital, and the Afterword in the 2008 edition with Zachary pontificating about 2008 Microsoft. I think <em>Showstopper</em> was at its best when reporting on the week-by-week challenges and worker vignettes during NT development, and at its worst when trying to analyze the big picture. Another problem with the book is that it tries to cover too many characters. It was easy to lose track of who was who. You will be treated to many mini-biographies, which while interesting, are not enough to get you invested in each of the players.</p>
<p>Despite its flaws, <em>Showstopper!</em> is worth reading because it pulls back the covers of a Herculean software project in human terms. If you are interested in computer software history or the business history of Microsoft in the early 1990s, it’s a must read. Software developers with an appreciation of computer history will find it compelling and enthralling, if they make it past page thirty.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-79284208340241242592020-03-16T01:47:00.001-04:002020-03-16T01:47:50.437-04:00One Year of Classic Computer Science Problems in Python<p>Approximately one year ago today, my most recent book came out, Classic Computer Science Problems in Python. It is the second book in the <a href="https://classicproblems.com">Classic Computer Science Problems series</a>. You can purchase it on <a href="https://amzn.to/38QbwFK">Amazon</a> or through the <a href="https://www.manning.com/books/classic-computer-science-problems-in-python?query=classic">publisher’s website</a>. It has been an amazing year for the book. </p>
<p>I had the good fortune to be on several podcasts to promote the book. I really appreciate all of the podcast hosts who gave me the honor of being on their show. It made a huge difference in sales. For example, my appearances on <a href="https://talkpython.fm/episodes/show/211/classic-cs-problems-in-python">Talk Python to Me</a> and <a href="https://www.pythonpodcast.com/computer-science-in-python-episode-197/">Podcast Init</a> alone accounted for approximately 1,000 sales according to the publisher. To see all of the podcasts I’ve been on, checkout the interviews section of <a href="https://classicproblems.com">classicproblems.com</a>.</p>
<p>This has been the most successful book that I’ve written by an order of magnitude. It’s surpassed the sales of Dart for Absolute Beginners and Classic Computer Science Problems in Swift by a multiple of their combined sales. I appreciate all of the support from the community. I think Classic Computer Science Problems in Swift was a good book but the publisher was right in saying that it needed a larger language audience. Python not only has more users in absolute numbers, it also has more users in one of the major target demographics for the series, which is self-taught programmers who missed out on a computer science education.</p>
<p>I’ve done many things to promote the book, and I appreciate how my publisher, Manning, has advertised the book to their audience. However, more effective than anything have been the podcast episodes. I can’t tell you how many people have told me they learned about the book through a podcast episode. Podcast episodes have even led to translations. If I hadn’t appeared on the mostly Portuguese (but sometimes English) podcast <a href="https://castalio.info/episode-142-david-kopec-classic-computer-science-problems-in-python.html">Castalio</a>, then perhaps the Portuguese edition would not have come out.</p>
<p>Amazingly, the book is now on target to be translated into seven languages, including: <a href="https://www.piter.com/product/klassicheskie-zadachi-computer-science-na-yazyke-python">Russian</a>, Polish, German, Traditional Chinese, <a href="https://www.amazon.co.jp/dp/4873118816/ref=cm_sw_r_tw_dp_U_x_ugx7CbV8Y2KET">Japanese</a>, Korean, and <a href="https://www.amazon.com.br/dp/8575228056/ref=cm_cr_dp_d_vote_lft?ie=UTF8&voteInstanceId=R3W3SP9UP0WVGD&voteValue=1&csrfT=gufgfS3rvSPOqmLr7LnyGtHNABMgKeZTQw91CYwAAAABAAAAAF5u8EdyYXcAAAAA%2B4kUEk%2F7iMGR3xPcX6iU#R3W3SP9UP0WVGD&">Portuguese</a>. Interestingly, the only translation publisher that has been in regular contact with me has been O’Reilly Japan. I think they did a really nice job on their edition, and I thank them for their attention to detail. It’s interesting to see how the book’s teaching style (informal in terms of theory/math, to the point, and code heavy) appeals to some cultures and not to others. Anecdotally, my worst review has been for the Russian edition, and some of my best reviews have been out of Germany for the English edition. Of course I can’t tell you if the Russian translation is good or not, since I don’t speak Russian.</p>
<p>By far the most controversial decision I made about the book was to use type hints/type annotations throughout. This decision alone led to some of the worst reviews of the book. Would I do it again? It’s impossible to say how many people bought the book because it was one of the first Python books to use type hints throughout. I do think the type hints add value in terms of readability once you get used to them, but I can definitely see how the effect of turning some people off, makes any benefits not worth it. And of course I agree that the way Python does type hints is still too verbose.</p>
<p>Looking forward, one nice thing about the Python book versus the Swift book is how much more stable a language Python is. I wrote both books according to the latest versions of their languages respectively. However, by the time the Swift book came out (it took 6 months to go from done to store shelves) it was already a little outdated due to the fast pace of change in the Swift language. Python on the other hand, has a much longer shelf life and greater backwards compatibility between versions.</p>
<p>Finally, I am currently writing the third book in the series, Classic Computer Science Problems in Java. I look forward to it being released later this year, so look out for it if you are a Java aficionado. To decide what language to do next, we did a poll of Manning readers that had 300 votes. Java practically tied with Go. The idea of going with Java is that this book did well in a large language community (Python) and only okay in an emerging language community (Swift). Writing a book in Java feels like going back to my roots since Java was one of the first “real” languages that I learned in the late ’90s. I have done some professional projects in Java as well, so rest assured that I’m competent to write it!</p>
<p>I’d like to thank all of the readers who have purchased the book. I’d like to thank anyone who’s shared their constructive feedback. And, I’d like to thank the team at Manning. If you are a reader and you like the book, please do leave a review on Amazon or your place of choice.</p>
<p>Also, it goes without saying, but please stay home during the coronavirus crisis if you can. Stay safe!</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-12873898378457524492019-11-27T00:03:00.001-05:002019-11-27T00:03:36.822-05:00Book Review: Unix: A History and a Memoir by Brian Kernighan<p>Today, I finished reading <a href="https://amzn.to/2OmznWy">“Unix: A History and a Memoir”</a> by legendary computer scientist <a href="https://en.wikipedia.org/wiki/Brian_Kernighan">Brian Kernighan</a>. Kernighan’s accomplishments are too many to list in this space (writing the definitive book on C, co-author of the AWK programming language, to name just a couple), but some people may not know that he was also deeply intertwined with the development of Unix. In this short volume, Kernighan recounts a comprehensive history of the extremely influential and widely used operating system, told from a personal perspective.</p>
<p><a href="https://en.wikipedia.org/wiki/Unix">Unix</a>, in its early days, was largely the product of Kernighan’s colleagues <a href="https://en.wikipedia.org/wiki/Ken_Thompson">Ken Thompson</a> and <a href="https://en.wikipedia.org/wiki/Dennis_Ritchie">Dennis Ritchie</a> at <a href="https://en.wikipedia.org/wiki/Bell_Labs">Bell Labs</a>. But Kernighan was actively making contributions almost from the beginning. His intimate personal knowledge adds a lot of value to the book. Kernighan maintains a good balance between “official history” and his own involvement throughout. He explains concepts related to Unix and its ecosystem clearly and methodically.</p>
<p>There’s no doubt that this book has a limited audience. In my opinion, to find the book interesting, you need to have a pre-existing interest in computer history, Unix, and programming (in that order). If you already have some familiarity with using Unix (or its derivatives) from the command-line, that will certainly help you understand the significance of many of the items that Kernighan discusses. If you have no prior experience with Unix, then I don’t know why you picked up this book or read this review!</p>
<p>At just 180 pages, with plenty of illustrations, “Unix: A History and a Memoir” is an easy read. Yet, Kernighan still manages to pack plenty of detail. He concentrates the most on interesting user-facing innovations within Unix, and innovative programs that became standard pieces of its ecosystem. Kernighan explains clearly how all of the pieces fit together and evolved from one another. This provides interesting insights for software developers and system designers.</p>
<p>Kernighan also spends plenty of pages on the human-side of Unix, including short vignettes about his colleagues and what the work environment was like at Bell Labs. I appreciated these touches and they really helped paint a complete picture of the operating system’s development in my mind. Kernighan is a good story teller.</p>
<p>Kernighan has written many widely read technical books published by highly regarded outlets. I have previously read his books <a href="https://amzn.to/2smd22L">“The C Programming Language”</a> and the <a href="https://amzn.to/2rt1eLB">“The Go Programming Language.”</a> Like those books, the writing and editing in this self-published memoir is of the highest quality. Yet, a minor point is that the cover design is not. It’s pixelated and looks like something straight out of the ’80s (maybe he was going for that aesthetic). This is ironic given the book’s significant content on type-setting software. I almost wonder if Kernighan did this to make a point along the lines of “don’t judge a book by its cover.” More likely, he just didn’t realize it would come out that way. Even Brian Kernighan makes mistakes.</p>
<p>“Unix: A History and a Memoir” is an excellent book that achieves the wonderful virtues of Kernighan’s other books by being succinct, comprehensive, and clear at the same time. Kernighan is a talented writer, and every word is more meaningful because he lived the subject matter inside and out. The book has a quite limited audience, but if you are in that audience, you should definitely check it out.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-18075434418873357582019-07-17T20:55:00.001-04:002019-07-17T20:55:58.262-04:00Books About Apple and Steve Jobs<p>I’ve been reading books about Apple and Steve Jobs for two decades. I was always really into the company and its charismatic cofounder, Steve Jobs. In 2000, when I was 13 years old, I read my first full-length Apple book, <a href="https://amzn.to/2YaOrfx">The Second Coming of Steve Jobs</a>. I kept voraciously reading Apple books and I’ve never stopped. In this post, I will try to summarize that knowledge for you by providing a very brief summary of every Apple and Steve Jobs book I’ve read. I will also categorize each book so that you can more easily find one related to your interest. At the end I’ll summarize the three pieces of media about Apple you must consume to get an introduction to the company’s history.</p>
<h2>Early Apple History 1976–1997</h2>
<p>I think it’s important to understand not just modern Apple, but early Apple as well, if you really want to understand the company’s values. Apple itself has its employees study Apple history through its <a href="https://en.wikipedia.org/wiki/Apple_University">Apple University</a> program. </p>
<h3><a href="https://amzn.to/2LpP0MB">Return to the Little Kingdom: Steve Jobs and the Creation of Apple</a> by Michael Moritz (1985, 2009)</h3>
<p>This is the single best book about Apple’s early history from its founding in 1976 until the release of the Macintosh in 1984. The updated material in the latest edition doesn’t add much value, but if you primarily want to know about the very earliest days of Apple, this is your book.</p>
<p><a href="https://amzn.to/2SjTVzf">Checkout my full Amazon review of Return to the Little Kingdom.</a></p>
<h3><a href="https://amzn.to/2JLfrcb">Odyssey: Pepsi to Apple: A Journey of Adventure, Ideas, and the Future</a> by John Sculley and John Byrne (1987)</h3>
<p>John Sculley was the longest serving (1983–1993) CEO of Apple other than Steve Jobs (but Tim Cook may soon take that title) and this pseudo-autobiography was written just four years into his tenure. It’s a pretty good biography, but its main value to an Apple fan is probably Sculley’s perspective on his interactions with Jobs, and what led to their falling out. </p>
<h3><a href="https://amzn.to/2JJ6GPY">Defying Gravity: The Making of Newton</a> by Markos Kounalakis and Doug Menuez (1993)</h3>
<p>No book gives you a better sense of what product development was like at Apple during the Sculley era. The Newton was arguably well ahead of its time. It’s an interesting side story and it also paints a picture of Sculley as someone who desperately wanted to have the “vision” that Steve Jobs had, even if he did not.</p>
<p><a href="https://amzn.to/2NYaCSg">Checkout my full Amazon review of Defying Gravity.</a></p>
<h3><a href="https://amzn.to/2SpWDDl">On the Firing Line: My 500 Days at Apple</a> by Gil Amelio and William Simon (1998)</h3>
<p>Gil Amelio was Apple’s CEO for just 500 days, but he pivotally made the decision to buy NeXT, which brought Steve Jobs back to the company and created the technological underpinnings for modern Apple. This book, like Odyssey, is probably most interesting to a fan for its portrayal of Steve Jobs interactions with another Apple CEO.</p>
<h3><a href="https://amzn.to/2XPzT5K">Apple Confidential: The Definitive History of the World’s Most Colorful Company</a> (1999, 2004)</h3>
<p>I read the first edition of this book. It covers primarly vignettes from the early years and the non-Jobs era of Apple (1985–1997) and came out in 1999. For that era, it’s arguably one of the most comprehensive. I have not read the newer, 2004 edition.</p>
<h3><a href="https://amzn.to/2JOBhLQ">iWoz: Computer Geek to Cult Icon: How I Invented the Personal Computer, Co-Founded Apple, and Had Fun Doing It</a> by Steve Wozniak and Gina Smith (2007)</h3>
<p>Steve Wozniak’s autobiography chiefly focuses on his early life and his years at Apple. The writing style is very simple, almost childlike. But this is the only book written by one of Apple’s cofounders and Woz has a very positive, inspirational message.</p>
<p><a href="https://amzn.to/32wAvvz">Checkout my full Amazon review of iWoz.</a></p>
<h2>Steve Jobs</h2>
<p>Reading about Steve Jobs is really like reading about Apple because his persona, business decisions, and values are so deeply ingrained in the company. While not all of these books are about business, they all capture a different side of Steve Jobs.</p>
<h3><a href="https://amzn.to/2YcPzza">Steve Jobs</a> by Walter Isaacson (2011)</h3>
<p>The “official” Steve Jobs biography, which came out shortly after his death in 2011, is one of the most widely read business biographies of all time. It is comprehensive and required reading for any Apple fan or Steve Jobs fan. Not all reviewers felt Isaacson fully grasped or expressed all of Steve Jobs accomplishments sufficiently, nor truely captured his character. However, it still tells the general story of Steve Jobs life well and is important as a launching point for other biographies.</p>
<h3><a href="https://amzn.to/2XPBMPS">Becoming Steve Jobs: The Evolution of a Reckless Upstart into a Visionary Leader</a> by Brent Schlender and Rick Tetzeli (2015)</h3>
<p>This biography was almost written as a “response” to the Isaacson book. It better covers the NeXT and Pixar years. In fact, it makes the case that those years in Steve Jobs life were critical for his later tremendous success after returning to Apple. A good book that should probably be read after the Isaacson book by any true fans.</p>
<h3><a href="https://amzn.to/2YaLz2m">The Second Coming of Steve Jobs</a> by Alan Deutschman (2000)</h3>
<p>Unlike many Steve Jobs biographies, this short biography, primarily focusing on NeXT, Pixar, and his first couple years after returning to Apple, is no hagiography. Instead, its highly critical of his management style, while still doing a good job expressing his incredible charisma and taste. However, it’s definitely biased, and I wonder if it would be so negative if Deutschman had written it just a few years later.</p>
<h3><a href="https://amzn.to/2SmGOxq">The Bite in the Apple: A Memoir of My Life with Steve Jobs</a> by Chrisann Brennan (2013)</h3>
<p>This is a deeply personal book, written by Steve Jobs high school (and beyond) girlfriend, with whom he had his daughter, Lisa. If you want to learn more about Steve Jobs early years and his personality at that time, this is arguably the best book.</p>
<p><a href="https://amzn.to/2LoYzvl">Checkout my full Amazon review of The Bite in the Apple.</a></p>
<h3><a href="https://amzn.to/2xTEWm6">Small Fry</a> by Lisa Brennan-Jobs (2018)</h3>
<p>This recent book, written by Steve Jobs daughter Lisa, has received literary acclaim. Lisa does come off as a bit bitter, but that’s understandable once you read the book. This book gives great insight into Steve Jobs family life.</p>
<p><a href="https://amzn.to/2SkK8ZB">Checkout my full Amazon review of Small Fry.</a></p>
<h3><a href="https://amzn.to/2JNvYwi">A Regular Guy</a> by Mona Simpson (1996)</h3>
<p>This novel by Steve Jobs biological (but with whom he didn’t grow up) sister, <a href="https://en.wikipedia.org/wiki/Mona_Simpson">Mona Simpson</a>, is supposedly fictional, but it’s well known that it was based on Steve Jobs and his relationship with his daughter, Lisa. Taking place primarly in the 1980s and early 1990s, this is a well-written novel by a literary star. Between A Regular Guy, Small Fry, and The Bite in the Apple, you can read about the relationship between Steve and Lisa from three different perspectives, and all of them are people who were involved in the situation. A Regular Guy goes out of its way to capture its main character’s (Steve Jobs ostensibly) personality.</p>
<h3><a href="https://amzn.to/2Y3d263">Inside Steve’s Brain</a> by Leander Kahney (2009)</h3>
<p>Inside Steve’s Brain is not a bad book, but neither is it comprehensive or particularly better than the “mainline” Steve Jobs biographies. Kahney does do a good job boiling down some of Steve Jobs most important traits as a business leader into a shorter volume. This book is more Apple focused than many of the above books.</p>
<h2>Modern Apple</h2>
<h3><a href="https://amzn.to/2Y3d263">The One Device: The Secret History of the iPhone</a> by Brian Merchant (2017)</h3>
<p>If you want to understand the design process, technologies, and materials that went into producing the first iPhone, then this is a good starting point. It’s not actually particularly Apple centric, instead spending time in South American mines and with technologists that worked on various components of the iPhone. However, it is a unique book that gives you a more global perspective on Apple’s supply chain.</p>
<h3><a href="https://amzn.to/2Y3HDAt">Jony Ive: The Genius Behind Apple’s Greatest Products</a> by Leander Kahney (2013)</h3>
<p>Jony Ive recently announced he’s leaving Apple, but during his time at Apple he arguably became the world’s foremost designer and his influence on the company cannot be understated. This biography suffered from a lack of access, but it does give new insight into Jony Ive’s early years. It is mainly worthwile as the only full length biography of Jony Ive.</p>
<p><a href="https://amzn.to/2JHZdRe">Checkout my full Amazon review of Jony Ive.</a></p>
<h3><a href="https://amzn.to/2O3OV3a">Tim Cook: The Genius Who Took Apple to the Next Level</a> by Leander Kahney (2019)</h3>
<p>I was pretty critical of this biography of Tim Cook, as you can read in the link to my Amazon review below. Tim Cook frankly deserves a better biography. That said, like with his Jony Ive book, Kahney gets bonus points for being the first (and so far only) person to write a biography of this important Apple player.</p>
<p><a href="https://amzn.to/2XLOLSx">Checkout my full Amazon review of Tim Cook.</a></p>
<h3><a href="https://amzn.to/2XUAjCX">Creative Selection: Inside Apple’s Design Process During the Golden Age of Steve Jobs</a> by Ken Kocienda (2018)</h3>
<p>This fantastic little volume by Ken Kocienda, puts you in the shoes of a software developer at Apple during Steve Jobs second stint at Apple. It’s insightful and interesting.</p>
<h2>Miscellaneous Related Books</h2>
<h3><a href="https://amzn.to/2JLhNb3">To Pixar and Beyond: My Unlikely Journey with Steve Jobs to Make Entertainment History</a> by Lawrence Levy (2016)</h3>
<p>This incedibly positive book about Levy’s experience working at Pixar on its financing during and after the release of Toy Story paints Steve Jobs with a very enthusiastic and positive brush. It does give some insight into Steve’s thinking at the time, during the era when he was about to return to Apple.</p>
<h3><a href="https://amzn.to/2JNbeVC">Creativity, Inc.: Overcoming the Unseen Forces That Stand in the Way of True Inspiration</a> by Ed Catmull and Amy Wallace (2014)</h3>
<p>The co-founder of Pixar tells its entire story from the beginning and highlights some management strategies that worked effectively for it during its golden age. Steve Jobs makes many appearances and it’s likely he took some of the management philosophies he learned at Pixar back to Apple for his second stint.</p>
<h3><a href="https://amzn.to/2JNzlTZ">The Silicon Boys</a> and <a href="https://amzn.to/2JNzoiD">High-Tech Titans</a></h3>
<p>Both of these books give a good overview of what the tech industry as a whole was like in the late 1990s. Both include decent chapters on Steve Jobs.</p>
<h3><a href="https://amzn.to/2Yb4hGY">Fearless Genius: The Digital Revolution in Silicon Valley 1985–2000</a> by Doug Menuez (2014)</h3>
<p>Menuez had insider access at NeXT when he took the photos for this photo book. There are no great insights to be had here, but there are some great pictures of Steve Jobs and early NeXT.</p>
<p><a href="https://amzn.to/2XLWpwo">Checkout my full Amazon review of Fearless Genius.</a></p>
<h3><a href="https://amzn.to/2LnzjFD">Iconic: A Photographic Tribute to Apple Innovation</a> by Jonathan Zufi, Forest McMullin, and Lisa Clark (2014)</h3>
<p>This beautiful photo book is a testament to Apple’s many amazing industrial designs over the years. Take note that its solely focused on hardware instead of software. Interestingly, Apple itself put out a very similar but much more expensive book itself shortly after Iconic’s publication called “Designed by Apple in California.”</p>
<h2>Movies</h2>
<p>The best value you can probably get is to watch some old full length interviews with Steve Jobs on YouTube. That said, there are a few movies I would recommend.</p>
<h3><a href="https://amzn.to/2Y0XOdO">Pirates of Silicon Valley</a> (1999)</h3>
<p>This made-for-TV movie telling the story of the early days of Apple and Microsoft has wonderful acting, excellent production values, and is fairly accurate in terms of history. Noah Wyle is by far the best actor to ever portray Steve Jobs. The movie is very romantic. When I saw it on TV when I was 12 years old in 1999, it solidified my interest in Apple, which I was already very into. It also solidified my interest in working in tech and specifically the business of tech. Highly recommended!</p>
<h3><a href="https://amzn.to/2XT0XfD">Jobs</a> (2013)</h3>
<p>Ashton Kutcher really tried his best. You can tell he was trying really hard and really wanted to do Steve Jobs justice. I think he largely succeeded, although he did not do as well as Noah Wyle. This movie covers a wider gamut of Steve Jobs life than Pirates, but it’s also less accurate. That said, it gets the overall arc correct.</p>
<h3><a href="https://amzn.to/2SjsENt">Steve Jobs The Lost Interview</a> (1995, 2012)</h3>
<p>This release of old interview footage from 1995 is actually quite compelling because it was just such a good interview. Cringely really got Jobs to talk and think about the big issues in the industry.</p>
<h2>Media I’ve Avoided</h2>
<p>I’ve avoided consuming media about Apple that seems overtly unfactual or extremely biased from the getgo. Here are some items I’ve avoided </p>
<h3><a href="https://amzn.to/2SlQB6M">Steve Jobs</a> (2015)</h3>
<p>This movie has been cited by many who were present for the events portrayed as HIGHLY inaccurate.</p>
<h3><a href="https://amzn.to/2SlR88M">Haunted Empire: Apple After Steve Jobs</a> by Yukari Iwatani Kane (2014)</h3>
<p>Biased right from its title, this 2014 book’s premise obviously was wrong. Apple continued to do very well and became the first trillion dollar company after its publication. Reviews were also poor.</p>
<h3><a href="https://amzn.to/2LqLgdQ">iCon</a> by Jeffrey S. Young and William L. Simon (2005)</h3>
<p>Steve Jobs himself called it a “hatchet job.” So much so that he removed its publisher’s books from Apple stores. Perhaps he didn’t like the criticism, but if it was so offensive to him, I presume it’s pretty biased given all of the other books about him before and since didn’t lead to such reactions. I’ve also heard that it just doesn’t compare favorably to The Second Coming of Steve Jobs. Either way, it just seems unnecessary given the other books available.</p>
<h2>Where should you start?</h2>
<p><strong>If you’re at the beginning of a journey to learn about Apple History then I would recommend <a href="https://amzn.to/2LpP0MB">Return to the Little Kingdom</a>, <a href="https://amzn.to/2YcPzza">Steve Jobs</a>, and <a href="https://amzn.to/2Y0XOdO">Pirates of Silicon Valley</a>.</strong> If you’re interested in Steve Jobs specifically, then I would recommend all of the books I mentioned in the Steve Jobs section above, plus Return to the Little Kingdom and To Pixar and Beyond. But perhaps the most value you can get is to watch and read many of the old interviews with him. Finally, if you’re interested in modern Apple, then unfortunately I do not have any great book to recommend that is not overly specific. All of the books in the Modern Apple section above are about one specific facet of the company—I think the best books about modern Apple are still being written.</p>
<p>One more fantastic resource is the website <a href="https://allaboutstevejobs.com">All About Steve Jobs</a>. And of course there is a ton of great content on YouTube, including all of Apple’s old keynotes. Enjoy!</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.comtag:blogger.com,1999:blog-7813480998226110740.post-48766275395879247422019-06-20T20:22:00.001-04:002019-06-20T20:22:33.333-04:00Book Review: Defying Gravity - The Making of Newton<p><a href="https://amzn.to/2FnLdur">Defying Gravity: The Making of Newton</a> is a special and unique book. Photographer Menuez and author Kounalakis were provided extensive access to Apple’s Newton team throughout the product’s development over multiple years to document the process of its creation. When they finished writing the book in 1993 at the time of the Newton’s release, it was unclear whether the product would be successful. Of course it was not successful, but the book is still a gripping read as one experiences the ups-and-downs of high pressure product development at John Sculley era Apple. It also provides an incredibly high-bandwidth look into the early 1990s technology industry.</p>
<p>From its experimental layout, to its color palette and cultural references, Defying Gravity is <em>very</em> early ’90s. The photography by Menuez is skillful and reminiscent of his other photo book covering roughly the same period in the tech industry, <a href="https://amzn.to/2MW78z8">Fearless Genius</a>. However, this is much more than a photo book. The writing has depth and really takes you on the journey of Newton from idea to launch. The authors balance covering marketing and engineering well. It’s a much better balance than most tech business books achieve, which usually are overly focused on marketing. There are also photos and vignettes that add a personal touch—really letting you step into the shoes of the team members. In particular you really get to know marketer Michael Tchao and engineer Steve Capps, who could arguably be called the book’s protagonists. Interestingly, both of them have enjoyed long-and-illustrious careers in the technology world after Newton.</p>
<p>Defying Gravity’s only fault is that it is perhaps too uncritical. It seems eternally optimistic about the technology, also a very ’90s trait. While this makes for refreshing reading in the age of big-tech pessimism, it also seems like the authors perhaps traded access for spin. All of the Newton team members at Apple are presented in a flattering light. Maybe this is accurate, but it doesn’t always feel genuine. John Sculley in particular, with a quarter-century of further hindsight, could perhaps be better viewed as using the Newton as a desperate grasp for his own legitimacy, than as being a “visionary.”</p>
<p>Defying Gravity also paints a picture of an out-of-control work culture that celebrated continuous 16-hour days. There is something heroic about giving your all to a cause that you really believe in. And that was clearly portrayed throughout the book. However, there is also something troubling about pushing people to work beyond their limits. And for one team member this seems to have led to tragic consequences. I think a book written today would have a more balanced view of the pros-and-cons of such an environment.</p>
<p>Defying Gravity provides a unique look at the high pressure development of an early 1990s computing platform at Apple. It’s worth reading for anyone interested in that era of technology, Apple history, or who enjoys business dramas. It’s unimaginable a writing team today would be provided such unprecedented access, which is unfortunate because the result is really quite enjoyable and insightful.</p>DKhttp://www.blogger.com/profile/03166332980249153200noreply@blogger.com