Ufuk Kayserilioglu
👤 PersonAppearances Over Time
Podcast Appearances
But we did other things to compensate for that. So there's a very understandable reason for why we couldn't conclude on that hypothesis of if we were able to reduce trivial errors is because our core monolith does more dynamic things than the stuff that we have in our code base. So it
But we did other things to compensate for that. So there's a very understandable reason for why we couldn't conclude on that hypothesis of if we were able to reduce trivial errors is because our core monolith does more dynamic things than the stuff that we have in our code base. So it
kind of like serializes objects to the database and then reads serialized objects from the database, et cetera, et cetera. And there's no way a static type checker can like prevent you from, you know, deserializing an object that definition for which has mistakenly been remote from the cloud base, right?
kind of like serializes objects to the database and then reads serialized objects from the database, et cetera, et cetera. And there's no way a static type checker can like prevent you from, you know, deserializing an object that definition for which has mistakenly been remote from the cloud base, right?
So suppose you had like a user class and there was a user object serialized somewhere and then someone removes the user class and now someone tries to deserialize the user object. and then boom, your application fails, right? Because the user class doesn't exist anymore. So you can't deserialize it. So we obviously can't prevent those kinds of errors.
So suppose you had like a user class and there was a user object serialized somewhere and then someone removes the user class and now someone tries to deserialize the user object. and then boom, your application fails, right? Because the user class doesn't exist anymore. So you can't deserialize it. So we obviously can't prevent those kinds of errors.
So there are like other dynamic things going on. And like I said, core is such a large code base and there's like so much variance across like it's failure modes that it's hard to get the signal that we were looking for among all that background.
So there are like other dynamic things going on. And like I said, core is such a large code base and there's like so much variance across like it's failure modes that it's hard to get the signal that we were looking for among all that background.
So then we said, we actually need a smaller code base to test our hypotheses on, to see if we're able to move the needle in that type safety in any direction. So after we did the initial adoption on core, we turned our attention to a much smaller and more opinionated code base within the company. And that's a tool that we call dev. So dev is a tool that
So then we said, we actually need a smaller code base to test our hypotheses on, to see if we're able to move the needle in that type safety in any direction. So after we did the initial adoption on core, we turned our attention to a much smaller and more opinionated code base within the company. And that's a tool that we call dev. So dev is a tool that
every developer at Shopify has on their computer. And it's the tool that every developer uses during their daily work workflows. So there is a command line tool, you use it to clone Shopify repositories, then you only invoke dev up and it knows Based on a configuration file within the repo, it knows which dependencies to install, which commands to execute to bring the application up.
every developer at Shopify has on their computer. And it's the tool that every developer uses during their daily work workflows. So there is a command line tool, you use it to clone Shopify repositories, then you only invoke dev up and it knows Based on a configuration file within the repo, it knows which dependencies to install, which commands to execute to bring the application up.
And it also gives you different shortcuts like dev test or dev type check, which was something we added to run various things. So dev is a very opinionated code base because it's a developer tool. It's a command line tool. Everyone uses it throughout the day. So it needs to be fast. It has, for that reason, it has no external dependencies. So it doesn't use any gems or anything.
And it also gives you different shortcuts like dev test or dev type check, which was something we added to run various things. So dev is a very opinionated code base because it's a developer tool. It's a command line tool. Everyone uses it throughout the day. So it needs to be fast. It has, for that reason, it has no external dependencies. So it doesn't use any gems or anything.
If it needs some other code, it vendors them in. So it was like the ideal code base. And the team that's working on that code base is a small team that's been working on the same code base for a long time. So we talked to that team and we told them that we were interested in adding type annotations to the majority of the dev code base and to see what kind of an impact we could get on type safety.
If it needs some other code, it vendors them in. So it was like the ideal code base. And the team that's working on that code base is a small team that's been working on the same code base for a long time. So we talked to that team and we told them that we were interested in adding type annotations to the majority of the dev code base and to see what kind of an impact we could get on type safety.
That was a project that took a couple of months because it's especially hard to add typing to code that you already have because it means you need to understand how data is flowing throughout the code because you have some methods that ends up calling some other method and then combining the results from that other method by the result of another method call or something.
That was a project that took a couple of months because it's especially hard to add typing to code that you already have because it means you need to understand how data is flowing throughout the code because you have some methods that ends up calling some other method and then combining the results from that other method by the result of another method call or something.
So you have these chains of method calls that you need to understand. what types they return to understand what types your method in question is returning. So it becomes like a arduous process to fully type an existing code base. So that took a couple of months, but we approached that very methodically.
So you have these chains of method calls that you need to understand. what types they return to understand what types your method in question is returning. So it becomes like a arduous process to fully type an existing code base. So that took a couple of months, but we approached that very methodically.