thoughtbot
thoughtbot
YouTube Video
  • Software is eating the World and AI is eating software. The data-driven machine learning algorithms that power AI will not only upend programming, but lower the barriers to AI itself. We are entering a period of data-driven everything. Machine learning can already spot tumours more effectively than a trained radiologists and will soon drive your vehicle better than you can. However, building a da...

thoughtbot
thoughtbot
Blog Post
  • In addition to the mobile apps we create using first-party languages like Swift and Java/Kotlin, we’ve found that there’s a place for rapid, cross-platform mobile app development in React Native. We’ve historically eschewed cross-platform mobile frameworks because they haven’t allowed us to build the kinds of products we’re proud of, that users love to use, and that can be well-maintained over ti...

thoughtbot
thoughtbot
Blog Post
  • Developing software is a collaborative process that takes a tremendous amount of input from customers, designers, developers, and a company’s leadership team. We know the merits of shipping early and often, but doing so requires regularly making decisions with imperfect information. When it comes to effective decision-making, there is no one size fits all approach, but there are decision-making “s...

thoughtbot
thoughtbot
Blog Post
  • I was recently listening to a fantastic episode of the Fragmented pocast where the guest, Ray Ryan, mentioned that they make heavy use of finite state machines at Square. Inspired by that podcast and a Github gist detailing the use of composable finite state machines in Swift, I decided to try and utilize a similar concept to build an Android application, with the goal being to come up with an a...

thoughtbot
thoughtbot
Blog Post
  • On a client project recently, I was putting fake data together as a first pass for seeding a UI in Elm. The domain model looked fairly straightforward: module Data.Employee exposing ( Employee , Name(..) , EmployeeId(..) ) type alias Employee = { id : EmployeeId , fullName : Name } type EmployeeId = EmployeeId String type Name = Name Stri...

thoughtbot
thoughtbot
Blog Post
  • Hey thoughtbot podcast listeners! It’s that time of year again, as The Bike Shed is heading to Pittsburgh for our 4th annual trip to RailsConf! We’ll be back again this year, recording throughout the day on Wednesday, April 18th in Show Office A, right next to the entrance to the main Exhibit Hall. Feel free to drop in on one of our recordings, we’ll keep you up to date on who is recording when vi...

thoughtbot
thoughtbot
Blog Post
  • The three major ways to communicate with the outside world in the Elm Architecture are Cmd a, Sub a, and Html a. This is a curious thing to say, because none of those types do anything, in the imperative sense. Regardless, it’s tempting to think of Http.send as a function that kicks off an XmlHttpRequest() in the browser and you get the result as what you defined as your Msg type. It’s also tempt...

thoughtbot
thoughtbot
Blog Post
  • The Elm #gamedev community on Slack has started having monthly game jams. The rules are simple: Write most of the source in Elm Make the source publicly available Focus on code readability This is a collaborative rather than a competitive event so developers are encouraged to read each other’s code and learn from each other. February’s game jam set a theme of safety. I decided to write a towe...

thoughtbot
thoughtbot
Blog Post
  • The Elm #gamedev community on Slack has started having monthly game jams. That sounded fun so I built a pirate-themed tower defense game for the February jam. This being my first real foray into gamedev, I got stuck on multiple occasions. Figuring out how to properly do the coordinate math was particularly frustrating. Normally when I’m stuck on a big problem, I try to break it down into smaller ...

thoughtbot
thoughtbot
Blog Post
  • We have a new opening in our Austin studio for Development Director. If you or someone you know are interested, please get in touch. We believe there is a better way to work. We want to share it with as many people as possible. We do this through our work with clients, as well as in the things we learn, the products we build, the open source tools and content we publish, and the talks we give. Y...

thoughtbot
thoughtbot
Blog Post
  • The Elm #gamedev community on Slack has started having monthly game jams. That sounded fun so I built a pirate-themed tower defense game for the February jam. This was my first attempt at gamedev so I started with the simplest approach. Along the way, I found that I’d created a system where my game world was tightly coupled to environmental factors. Decouple your in-game coordinate system fr...

thoughtbot
thoughtbot
Blog Post
  • You’ve been building a community of like-minded folks who are paying attention to you. And now the launch of your new product is in sight. This is when you will start to activate your audience, who will become your first customers and help spread the word. 60 Days Before Launch When launch is in sight (seriously, don’t do this too early otherwise it can backfire) start to talk more about ...

thoughtbot
thoughtbot
Blog Post
  • We get approached often by many early stage startups who are super excited, ready to put down some cash, and feel ready to build out their initial MVP (minimum viable product). They have spent a lot time thinking about a problem they want to solve, planning, prototyping, getting positive feedback from their inner circle, and even designing out initial ideas. Now they are seeking help to make their...

thoughtbot
thoughtbot
Blog Post
  • As a non-technical founder, when you’re starting out on a new venture and choosing a strategy to build software, you may find yourself at a crossroads: do you hire a tech co-founder and in-house developers, or go the digital consultancy route? When it comes to considering the latter, it can be difficult to know if it’s right for you and your company, and if it is, when to engage and what to expect...

thoughtbot
thoughtbot
Blog Post
  • We have a new opening in our San Francisco studio for Development Director. If you or someone you know are interested, please get in touch. We believe there is a better way to work. We want to share it with as many people as possible. We do this through our work with clients, as well as in the things we learn, the products we build, the open source tools and content we publish, and the talks we g...

thoughtbot
thoughtbot
Blog Post
  • Tell Me When It Closes is our simple but useful service for keeping up to date with issues and pull requests on GitHub without getting lost in the noise. If you’re unfamiliar, check out our introductory blog post for more detail. In the past year, Tell Me When It Closes has sent thousands of notifications when discussions have concluded, but if we’re being honest, the notification email was a tru...

thoughtbot
thoughtbot
Blog Post
  • One of the larger risks when starting a new business is that you launch and no one knows about your product. In this post-launch phase, you can struggle to find sufficient numbers of early customers, leading to failure. By building your audience in advance of launching, you can ensure that like-minded people, who are your early customers, are already primed and paying attention. Understand...

thoughtbot
thoughtbot
Blog Post
  • One of our maxims at thoughtbot is to start with the problem, not the solution. It seems obvious at first, you need to know what you’re solving for, but I often catch myself jumping ahead and skipping out on some juicy divergent thinking. It takes an occasional reminder to catch myself as it happens. When kicking off a new project, start with the problem The first thing we do when kicking of...

thoughtbot
thoughtbot
Blog Post
  • When coming from object-oriented languages, I often hear people ask the question, “How do I organize my code? Modules are just bags of functions!”. That is a question I asked myself as well, but after using Elixir and Elm for a while, I have noticed that there is a principle of organization that I keep using and that I see in the wild. I like to think of it as the principle of attraction. The...

thoughtbot
thoughtbot
Blog Post
  • Ruby 2.5 introduces Object#yield_self, which can be thought of as a close cousin to Object#tap. Where tap executes a block returning the value it’s called on, yield_self yields the object its called on into the supplied block, returning the result of the block. Many have compared yield_self to Elixir’s pipe operator, |>, and while I use and enjoy the pipe operator in Elixir, I had a hard time env...

thoughtbot
thoughtbot
Blog Post
  • On my walk to work in London, it’s hard to avoid the Barbican Estate. I wander through it almost every day and can see it from the studio windows. It has become one of my favourite places in the city. The estate was built during the 1960-70s in an area of London destroyed during World War II. The estate was a vision of the future, creating an entire community which combined homes with everything p...

thoughtbot
thoughtbot
Blog Post
  • PostgreSQL has great support for objects stored as JSON. This is useful for those moments when you need to store data that could be variably structured, such as responses from other services’ APIs, or data that frequently travels together within your relational tables. A common trade-off for mixing scalar column data types (like varchar or integer) with column data types that handle more-complica...

thoughtbot
thoughtbot
Blog Post
  • Only Durham I love Durham, NC, and feel proud to call it my home. Though I’m originally from New York City, I have been living here for 14 years. Durham has grown up a lot in that time. In 2015, I launched my own design consultancy and joined the American Underground. I loved walking through downtown to work each day, and being part of a supportive community that helped me grow my business...

thoughtbot
thoughtbot
Blog Post
  • Having worked with hundreds of entrepreneurs over the last 15 years, I’ve seen many who have been percolating on their idea for a long time before finally taking the plunge and getting ready to actually build it and bring it to market. However, one of the biggest risks when starting a new business is accidentally building something people won’t use, or for which they won’t pay. This is a big wa...

thoughtbot
thoughtbot
Blog Post
  • The Problem We have a bunch of embedded models on an Ecto model. They’re self-contained and don’t need to be normalized or unique. They need to be flexible and lightweight and not have a lot of overhead in either UX or code. Here’s a migration that defines the embeds_many column according to how Ecto tells you to. defmodule Grocer.Repo.Migrations.CreateFoods do use Ecto.Migration def ...

thoughtbot
thoughtbot
Blog Post
  • Fifteen years ago we started thoughtbot. Many people don’t know that there are five original founders. In this special episode of Giant Robots Smashing into other Giant Robots Podcast, we go all the way to the beginning and take a look back on the founding of thoughtbot and it’s first years, told from the perspective of all the original founders and some early partners. From our first meeting i...

thoughtbot
thoughtbot
Blog Post
  • Maybe has a tendency to take over your codebase. This property is sometimes described as being viral. Uncertainty begets uncertainty. This sort of defeats the goal of using Maybe in the first place: give you confidence in the presence of most values. By slightly changing our approach to solving problems involving uncertainty, we can contain Maybe to those parts of our code that are truly optional...

thoughtbot
thoughtbot
Blog Post
  • Our world is full of uncertainty. This uncertainty bleeds into our programs. A common way of dealing with this is null/nil. Unfortunately, this leads to even more uncertainty because this design means any value in our system could be null unless we’ve explicitly checked it’s presence. Constantly checking the presence of every value is a lot of work so we tend to only check the riskiest places and ...

Out-Market Your Competitors?

Get complete competitive insights on over 2.2 million companies to drive your marketing strategy.

Create Free Account Log in

By signing up, you agree to the Terms of Service and Privacy Policy.

Out-Market Your Competitors

Get complete competitive insights on over 2.2 million companies to drive your marketing strategy.

Create Free Account

Already a user?  Log in

By signing up, you agree to the Terms of Service and Privacy Policy.