 Saya akan menggunakan slides kerana terakhir-akhir-akhir saya tidak pernah berubah Jadi saya beritahu ini dulu di September tahun lalu Dalam tahun lalu, Singapura, PSP, Komuniti berkombat dengan saya Itu berkondisi dalam konferensi Jadi kata-kata ini tentang bagaimana untuk orang lain Sebenarnya tidak Okey, kata-kata sebenar ini adalah membuatkan Pembinaan, keluarga JSOM untuk responsi API Jadi ini bukan apa yang anda panggil Saya akan beritahu PSP dan Fokastalkan Ia adalah lebih daripada pelajaran yang terbaik Oleh itu, saya akan mempunyai pelajaran yang terbaik Jadi saya tidak memperkenalkan Pada masa terakhir, saya beritahu anda yang terakhir lalu Jadi tolong beritahu saya jika saya membuat kesilapan Okey, jadi sedikit tentang diri saya, nama saya Zayan Saya adalah Singapura Dan saya selesai pembinaan Sebelum ini, saya sudah selesai Jadi nama saya Zayan Dan saya adalah dari Singapura So, saya juga mempunyai Zayan.hg Saya adalah pembinaan Zayan yang terbaik Pembinaan PSP dan Pembinaan Zayan Anda mahu menemukan lebih banyak tentang saya? Teruskan ke Zayan.hg Okey, jadi beberapa pembinaan Sekarang apabila kita membuat UI Pembinaan, kita mahu menjadi keluarga Pembinaan Oleh itu, kita mahu mempunyai pelajaran yang baik Pembinaan Pembinaan Jadi bagaimana dengan aplikasi, bagaimana dengan API? API mempunyai aplikasi Pembinaan Sebenarnya, jika anda mempunyai URL Pembinaan Pembinaan Dan menerimu jawapan Jadi bagaimana dengan API? API sepatutnya seorang pembinaan Siapa yang mempunyai pembinaan? Pembinaan Jadi Pertama Pembinaan ini mempunyai pembinaan API Bukan pembinaan API Kenapa? Pembinaan Pembinaan yang terbaik Kita mahu menjadi konservatif dalam apa yang anda katakan Pembinaan yang anda katakan Ia bermakna Apabila orang beritahu anda Mereka akan cuba Masak dan menggantikan diri Tetapi apabila anda menggantikan pembinaan Anda sepatutnya memastikan Pembinaan Pembinaan Dan kemudian Pembinaan Pembinaan yang berkata Tak percaya pembinaan Jadi saya tidak bercakap tentang pembinaan API Pembinaan Pembinaan Tak percaya pembinaan Selain itu, apabila orang berkata Mereka ada kesilapan Jadi kita tidak dapat mengawal Apa yang orang berikan kepada kita Tetapi kita dapat mengawal apa yang kita beri kepada orang lain Jadi kenapa ini? Jadi sekarang Saya lupa yang saya katakan Saya adalah web dan mobil pembinaan Jadi saya membuat javascript Saya membuat pembinaan, saya membuat badan Saya membuat devos, saya membuat mobil Jadi seperti yang Fook berkata Fulestat, saya tidak tahu jika itu membegat Saya bekerja untuk Saya bekerja untuk pembinaan sekarang Untuk tahun lalu Jadi Saya membuat pembinaan untuk mereka Macam mana untuk mempunyai pembinaan Lepas itu, mereka membuat projek Pembinaan Pembinaan dan kemudian Saya akan membantu mereka membuat mobil pembinaan Jadi ini menurut saya Mempunyai pada kedua-dua pembinaan Selain itu, saya mempunyai Api Mereka Api Mereka membuat Pembinaan Pembinaan Untuk pembinaan yang lain Sekarang saya membuat pembinaan Bukan Bukan Bukan membuat Pembinaan Pembinaan atau javascript Bukan sesuatu yang mempunyai Java dan Swift Yang membuat pembinaan yang kuat Berapa banyak anda membuat Java, C-Sharp Swift Tenscript Java Jadi, sebelum saya membuat pembinaan Java Javascript Java Mempunyai Pembinaan Pembinaan Ini adalah data yang berubah Jadi, bagi saya Ini adalah Pembinaan Java Mereka ada dua pembinaan Pembinaan Pembinaan dan Pembinaan H Pembinaan H Pembinaan H Dan kekaliannya 20 Jadi, api Memang ada satu atau lebih Pembinaan Pembinaan Bagi saya Untuk Pembinaan Pembinaan Jadi, mereka ada Pembinaan Pembinaan dan Pembinaan Pembinaan Ini saya akan memperkenalkan, kerana beberapa orang Mereka sebenarnya mempunyai Pembinaan Pembinaan dan Pembinaan Pembinaan Yang salah Pembinaan Pembinaan Tetapi mempunyai banyak Pembinaan Pembinaan Saya mempunyai Pembinaan Pembinaan Jadi, ini adalah Pembinaan Pembinaan Pembinaan untuk api Untuk membuatnya lebih baik untuk pembinaan Jadi, sehingga semua hidup akan lebih mudah Jadi, perkara pertama Ini adalah suatu suatu suatu suatu Pertama adalah Pembinaan Pembinaan Pertama, pembinaan Pembinaan Pembinaan Pembinaan, Pembinaan Pembinaan Jadi, pada kes ini, Kami melihat Saya tidak dapat memasukkannya Jadi, Pertama, kita melihat Pembinaan Pembinaan Pembinaan Pembinaan Pertama, pembinaan Pembinaan Pembinaan Pembinaan Jadi, jika kita membuat Pembinaan Jawa Pembinaan Pembinaan So, basically it will be a public dollar first name and a public dollar last name, actually it is PHP lah. Okay, let me see whether I... ah, very good. Okay, over here, class person and I have a first name property and the last name property. So, if I were to create a person, an instance of a person class and I passing the JSON response above. So, when I want to call the property, I'll just say my boss arrow first name, my boss arrow last name. Now, let's look at snake case, snake underscore case. So, in this case, now the JSON response is here, the one in wait. First underscore name is John, last underscore name is Do. And your person class, you name your properties accordingly. So, it's easier to map lah. So, when you call, when you want to access the first name of the boss of the person instance, my boss, it is in camel case but the properties is in camel or snake case. So, in this case, there is inconsistency. If you have a lot of these, if you find that my PHP variables or my Java variables are in camel case, then the properties or subsequent properties are in snake case. Now, another reason for advocating for camel case. Supposing, let's say, if you have a lot of properties, eliminating the underscore will kind of reduce the bandwidth. Let's say, for example, you have a list of 1,000 people. If you eliminate 1,000 underscore, then they'll save you about 1,000 bytes, I think lah. So, it's a lame reason but it's valid lah. Okay, now, WordPress. This is the WordPress table. So, for WordPress, actually, they use underscore, which is fine, which is fine. So, they have capital ID and then they have post underscore author. So, this is the database schema. The database columns are using underscore. So, for WordPress, for that code, they are also mapping exactly straight to the database columns. So, it makes life easier. So, it is fine. In this case, WordPress don't agree with me. We just find they were found about 20 years ago. It's fine. The most important thing is be consistent. Don't say, okay, my JSON response lah. I got one property is camel case, one property is snake case, one property is Pascal case, one property is kebab case. Kebab case is because it looks like this statistic going through. So, it's called kebab case. Kebs case and some mixed whatever case that you have to think of. So, most importantly is, you don't need to agree with me to use camel case for names. But the most important thing is to be consistent. Second point, use now only for objects, empty values for other data types. So, the first block, PHP, $s equals to 3, $s equals to now. No problem. Now, let's look at Swift. Swift is the programming language for iOS. So, now, if you put $s, if you declare $s as integer, PHP, you don't need to declare type. You don't care. But Swift, you have to. If you declare $s as integer and you try to set it to nah right or near right, it's not a lot. The compiler will stop you. It's not a lot. You want to do that? Yes, you can. You use something called optionals and put this question mark here. And then yes, you can set it to nah. So, for simplicity set, integer question mark is basically like a different type from integer. Just think of it this way. Now, simple. I want to just use question mark. Use optionals for all the Swift declarations. Fine, right? Not fine. Because when you use it, you need unwrap the optionals. So, in this case, for example, if I put $y as an optional integer, so integer question mark equals to 3. When I need to use it, I need to put y exclamation mark to extract out the value. I cannot put b equals to y plus 2. I must put b equals to y exclamation mark plus 2. Don't ask me why. So, it's quite messy. Now, for Java. Java, very simple, right? Just put integer. Sure, can put now. Yes. Depends of which integer you use. If you use small little int, a equals to y, you cannot set it to now. But if you use the integer class, capital I-N-T-E-G-R, yes, you can set it to now. So, in another two different case. So, the problem is in your JSON response, so normally, the application will consume me and then try to convert it to their own classes or their internal models. Okay? For Java and Swift, they say, okay, this class, I have this property set as as an integer ID. And today, integer cannot be now. Okay? Cannot, but very troublesome. Cannot be now. So, when you return with your response, you either put s colon 3 or s colon 0. You don't put s colon now, suddenly. Okay. An iOS app can be programmed in two programming languages. Objective C and Swift. Now, supposing you are writing a library or SDK for your client. So, for example, let's say Google Analytics SDK or Firebase SDK. So, people are going to use this SDK in Swift app and they are going to use the SDK in Objective C app. So, your SDK must be compatible with both languages. Now, so how to make it compatible with Objective C? Supposing if you were to write your SDK or your library or your framework in Swift. So, for everything you want to expose or to make compatible Objective C, you put it on notation. Okay. Now, so to model this person supposing I have this JSON over here. ID, tree, name, bob, address is an object. So, it's an object. JSON object and you have h now. Now, everything is fine. For Swift, for Objective C, everything can be exposed. Interger, string question mark, address question mark, string array of string, optional question mark. All this can be exposed to Objective C except for the last one. Interger question mark. Because you say that you tell me that integer can be now but I don't know how to cast it to the Objective C NS number type. So, I'm going to disalai altogether. So, this makes it very troublesome. Supposing all these things, I can put name, now it will work. I can put address, now my program still won't crash. I can put this one as hobby says now. But once I put H or ID as now, the whole application will crash. So, you need to write some code to handle it. So, when we say use now only for Objects, empty values for what data types we can take a live out PHP book. So, in PHP for the empty function, the folding values are considered to be empty. empty swing 2 quotation marks. 0.0 for float now for Objects force for Boolean the open square bracket and close bracket for empty array. Now, what happens if you cannot use 0? We want to say let's say unlimited, no limit on the number records per page or let's say there is no duration. Supposing let's say I'm streaming videos. This is a JSON response on the video meta data. And I say that this video is a live stream. So, there's no duration. So, I cannot put 0. 0 means there's nothing right. So, one suggestion is I can put minus 1 instead. So, supposing let's say if I have pagination, I have unlimited records per page I can put minus 1 instead of 0. And supposing let's say I don't know the H of the person or did the person did not fill it in. When I return it instead of 0 I can return minus 1. So, this is point number 2 in your JSON use now only for objects. For primitive data types it's a if your property is let's say name it is a string right. So, if there's no value for the name property use empty string. Another reason for this is for PHP you only have the same method for checking whether it's now or empty. Empty means empty string or empty string or 0,1. So, you can put if exclamation mark if not dollar S so empty or non-empty but for Java you need to check first if you declare S as a string type if it is not now you can say S dot equals empty string but if it is now whole program will crash so you need to check if S equals now or S dot equals so empty string so 2 checks just to check whether the string has some significant value for SWIF same thing you need to check whether it's equals to empty string and whether it's equals to near it's 2 different values okay number 3 point number 3 consistent data types okay most important as I said during the first point the most important thing is consistency so for example if I what is the problem with this? the problem with this is ID here is a number but over here ID here is a string inconsistent for PHP no problem okay that's why I love PHP S equals to 1 S equals to hello no problem okay no errors but if you try to do that in Java you declare it as integer and set it to 1 suddenly you say S equals to hello compiler will not get let you through same thing for SWIF if you declare as an integer and suddenly you set it to a string it's not a lot compiler will stop you okay so consistent data types if the property is an integer for example ID keep it as an integer throw all the objects and throw all the endpoints sometimes because your development team is probably spring to many development teams so some people do this and some people do this and point there's no overseer no team lead to oversee the whole thing then it came up each one come out with their own standards I use ID as an integer I use ID as a string so this is where the team lead comes into play now if it is meant to be an array okay keep it as a way throughout so for example in this case children is a list of children a list of children so there are two two objects here two children the first object the first child ID 1 H3 the second child the third object is ID 2 H5 now some people will do this I've come across this like I'm complaining this here there's only one child so I just change it straight to the object see this is a curly brace these three are all JSON this is a square bracket that means it is an array okay let me see this is a square bracket which is a list this is a curly brace JSON JSON object okay so if there's only one child you still keep it as a list it's just that you just throw away this one so in this case this should be you'll be children square bracket then curly bracket ID 1 H3 close curly bracket even if an array has only one element still keep it as a way don't suddenly change it to an JSON object if it's empty don't set it now set it to an empty array so consistent data types okay let me see ah ah this is very interesting I came across this recently so I added it to my slides sometimes you'll be careful no so what happens is supposing I have a product endpoint and then I have a per underscore page which is then the example I came across in real life is when you append a query stream parameter question mark per page suddenly I was coding my mobile screen it didn't crash then I think for one full day then I found out this was the issue so the people doing the REST API using lavel so like what separation of constants all these things it has nothing to do with framework it's all to do with the developer so if the developer is not careful so when they actually return a response they did not explicitly cast the fear to an integer they say okay just use variable value it's from the request string so in this case what I thought was sometimes it's integer sometimes it's string for the same endpoint just because set the query perimeters change point number 4 halfway through idea use strings for ID now the range for sign 64 bit integer is minus 9 quintillion to 9 quintillion if you use unsigned that means you don't need negative numbers 0 to 18 quintillion quintillion means billion billion 18 zeros now if you use the Facebook for Graph API you'll notice that when they return you the response the IDs are all strings they don't use integer it is probably because the number of Facebook posts in this whole wide world has already exceeded this value already so they use strings so probably you are not as bad as Facebook but the thing is supposing one day I don't want to use running integer for my video IDs I want to use some funny UUID or some format for my UID let's just change up very easy just change up then the Java the Android or iOS developer consume API will cry now supposing you are the rest API developer change very fast 5 minit I run my unit test probably 1 minit but how about the SDK SDK the iOS or the Android developer first they need to modify the SDK then they pass it to their clients and then the clients will try to update the apps when was the last time you update your Candy Crush or your Facebook app so that means they need to keep the API that version as long as someone is still using the old version so normally it may be 3 months or 6 months before someone actually update the apps on their phone so the turnaround time for them is very slow so try to keep your data types try to design it so that you won't change the data type so fast now point of 5 do not omit properties in your JSON response now in this case there are 2 at least as children so there is a children property but but has no children so the developer say I don't mind just skip so say bandwidth so now the developer consuming this response have to ensure that no crashes happen when it comes here we always assume that children property is there then suddenly your JSON response don't have and then your whole application crashes now this is a sweep for iOS please just because the children sometimes have sometimes don't have so I need to write all this whole chunk of code just to cater for it now children the number of children in this case is an integer just now I shared for a sweep SDK to expose an integer to object to C can but integer question mark optional integer cannot now in this case if the name is now this will still run because is name optional string equals now so suppose your JSON response the name property has a value of now this is still okay but if you omit or even if you omit the name property you just set it to a default now but if you omit property for children okay you crash because this is not optional integer and I cannot use optional integer because it cannot be exposed to object to C so you think how can Apple release sweep but we are still so relying on object to C don't ask me so in this case long story short when they when the developer receives a JSON response he will just use a JSON decoder passing the class signature person class person class and try to convert the whole JSON response the string to an instance of a person class long story short if the children property is always there whether you have children or don't have children right this whole chunk of code required public in it this whole chunk of code can be omitted and this is only how many? 4 properties imagine I have 10 properties in person class oh I cry because you need to do all this work point number 6 same top level properties across all endpoints now when you consume when you consume an API it is common to write some classes to model the response so for example I have a person endpoint so I have a person class to model the response the result from the person endpoint you are consuming the JSON string the JSON response for an API and then you cast it into a person object so over here I have 2 endpoints person endpoint this is the sample response status ID name address so address is the object over here I have a product endpoint so in this case status I have a list of products I have some pagination properties page and total now usually for iOS and Android after party libraries you can make it great decoding easier just take the whole JSON string from the response and then you pass it to the method and then you say which class I want to model and you pass it accordingly now so for example in iOS for Swift person response so this is to model the response from the person endpoint status ID name address person this is to model a person you notice that I don't have a person here all these fields correlate directly to the fields here status ID name address status ID name address so address I can put it as another class so address is the object so address is its own class street and zip similarly for the product endpoint status a list of products records per page page total and the product consists of ID now supposing I have 1000 endpoints so I always using the same code to decode and then to convert the JSON into an object I always using the same code so in this case what to do but all the responses look so different so Java and Swift they actually have this thing called generics so actually you can write a code as this handle a response so T can be a person response or a product response so when you call it you say I using this code for person endpoint I using this code for product endpoint so this is actually how you call it this is a response handler and I'll say response and I pass it to a person response class so I'll be using this code okay using this code to create a person object okay so this is the response handler and I pass it to a handle response handle response takes in a completion handler which is takes in the response type and the T T can be person response or product response now supposing you have 100 endpoints 100 different top level properties so you are doing this product response product, person response product person person response person address then product response product then merchant response then merchant then supposing 100 classes okay get your help so now I'm going to suggest to have the same top level just top level properties across all the endpoints so data error and pagination data error and pagination will always be objects if there's nothing for them you will use now remember I say if it's object and there's nothing for the object use now so data error and pagination now a suggested error response error right so there's no data so data I said to now error is object okay I can put message person of file why I put it as object because later on I can put my internal error code I can put some other exception or stat trace okay so I keep it as object so that I can bring new properties if I just put it as error as a string next time you want to squeeze more error meta data right then the poor Java and Swift developer they need to rewrite the SDK submit to the client put in their mobile app then the client need to submit the mobile app to the app store and wait for 3 months and hope for what will happen Apple will approve the app and then wait for 6 months for the end users to update the app so now there's no pagination so suggest now how about the person endpoint notice that I threw away the status property because developers must learn how to read HTTP response codes and not depend on the status key you know nowadays I see a lot of WestCPR they always have in the response they have a status key status success is success is a standard no because what if the person spell as capital S and then what if a person spell in all caps what if the person what the developer say status okay there is no standard list of answers for the status key okay and it's very prone to misspelling and miscapitalization so when the API returns you the response you will normally return you of a status code 403 for bidder 200 okay 500 server error developers must learn how to read that and not depend on the status key so now if I have a person endpoint the data so all the previous data in my person endpoint over here say id name address okay id name address is there any error don't have put now is there any pagination nothing so I put now so in this case it's done next one suggested response for our products endpoint it's returning a list of products now look carefully okay data is still an object just because I returning a list of products data doesn't suddenly turn into array or list so data is still an object so previously I have product so I just put a product key and is a list of products put here any error no error any pagination yes so this is where I put my pagination information your actual data should be separate for your pagination who cares if your product has only 10 products in this list I don't care so these are called meta meta data should be separate so that's why I put it inside pagination if you find it's too long you can just call it meta so records per page and total number records so put under the pagination key so only 3 top level so now I can have a response class and just have data error and pagination as objects I don't have a person response class and then a product response class and then a merchant response class don't have only one type of response class which is data error and pagination so this makes much easier for the consumer 7 2nd last one 8 2nd last one consistent naming properties so a picture makes a thousand words so the easiest way is actually to look at this very bad example so supposing I have a response for an employee endpoint the last name is role then for the spouse right they use family name which means the same thing and instead of ID you use person ID and instead of age you use years then from the manager endpoint instead of ID you use employee ID and then instead of last name they use surname and then instead of years and age they use how old so inconsistency okay consistent name it makes life much easier okay people do not need to waste time eh so this is what is last name what is family name no need everyone just use last name sometimes ID sometimes person ID if product endpoint will be product ID then manager will be manager ID very confusing just ID consistent naming and this is the last point congratulations okay use UTC time zone and ISO ISO 8601 for time sense so just a very quick question this piece of PHP code in yellow color highlighted in yellow color okay what would this produce on national day so national day Singapore is 9 of August so last year was 9 of August 2018 so how many of you say that when I run this at midnight on national day will produce answer number 1 hands up now answer number 2 hands up answer number 3 okay very good okay so actually it depends if I run it on my laptop this very nice old 2015 memory if I run it on my laptop over here like the answer will be 2 because of my laptop my PHP is set to Singapore time zone if I run it on my previous companies no sorry if I run it on this laptop it will be UTC time if I run it on my previous companies server it will give Singapore time okay it depends usually you think best practice when I set out server on Google Cloud or Azure or AWS easy to instance I will just put the time zone the time zone is definitely UTC wrong it depends on who is setting up so previously my system is just saying I'm the one looking at all the system loss all the time and I'm sitting here down here in Singapore so it makes sense that I should set the server time zone in a Singapore time zone so when I look at all the loss it's all in Singapore time then I can easily trace out when did this happen correct or not so do not assume do not assume that the server time zone is always set to UTC so when you code in your PHP application you must always explicitly set the time zone you cannot take chances you say I just call date see right then assume that it's UTC no by the way the dates will root read differently if you are in the US in UK in US it's month day year over here in Singapore and UK it's day month year so this is ambiguous you do not know which is which so the suggestion is to use ISO 8601 ISO 8601 is a standard so 4 DG year 2 DG month 2 DG day T and then hour always with the time zone now if you use date C over here at date C if your server time zone in Singapore this will be the answer the first one if your server time zone is set to UTC the answer will be this so you still have a problem so the recommendation is to use GM date so GM date is always in UTC or GMT now supposing if you are using the date time class and you want to set the time zone this is how you can do it new date time zone now you notice that I don't use C because over here I want to have micro seconds as well so I have a different format so in this case this is actual format of ISO 8601 4 DG year 2 DG month 2 DG day T 24 hour minute second and then the time zone now I had the okay let me see okay I had a sometimes it is also good to put the time zone in the request area now my whole talk is about API responses but when doing API request sometimes it is good to also put the time zone the request time zone explicitly because I say when I call from my mobile phone right so I can actually know the time zone that the phone is in I had a situation where we had a client overseas so actually he was in Singapore then we found that how come he is his mobile app our mobile app always run into several authentication areas so we keep debugging debugging and finally we found that his phone is always one hour behind our server time and the client is for Indonesia so BK his phone is set to Indonesia time zone whereas our server is running in Singapore time zone so it is always one hour difference and we didn't know that unless until we did some debugging so in this case if the mobile app had appended the time zone appended the time zone and the request time zone in the API request we will know because actually we all know the API request need to explicitly send in the time zone this sort of information need to be done by the the mobile app so as so SS01 including the time zone now there's some people say never mind Zainan why not just use unis timestamp very simple right it's always an individual right this is how many did you also forget it just use this very fine right now wait okay correct wait and say there's a limit okay 2031 right the year 2031 we have this unis timestamp but also now the problem is when you're coming first in the office and then there's fire to be fought we're always fighting fire and then you're looking through the lot when this happened right you compare this with this which one is easier to debug which one is easier to troubleshoot manager is breathing down so when this happened then you're looking through all the access slots you're looking through the API request and then you find that wait ah wait ah sir I go to this website I go to unis import time converter I copy and paste this paste oh actually this is 21st of September 6pm then the next one or wait wait wait I copy this one and paste ah no so I know that we should save bandwidth just now what I talk about underscore ah usually I will recommend that for time stamp fields you use AC01 with time zone with time zone now why with time zone because if you don't put you don't know okay one developer meeting oh I'm right now here in India what's the India time zone plus 5 hours and 30 minutes it's not a whole number even Singapore has had 6 different time zones time zone is a political thing okay it's nothing to do with geographical location it's a political thing so you cannot assume that oh this time zone definitely it's UTC time zone no in my previous company right when they send the gson responses right all this time zone all this time zone were always in Singapore time don't know right so supposing you have a remote developer in US so he assumes that it's US time zone then all your application will be passing it only the the principle is when you store in your database when you handle it in your application when you pass it in your gson response all your time stamp should always be in UTC only at the last mile when you show it to the user right when you show it to the user on the browser or in the mobile then you convert it to the users and users time zone or else internally everything should be using UTC time zone but to make it more clear okay always specify the time zone now so the last point last slide so the g is about the point all the points is K,I,S,S keep it simple as stupid so stupid so simple that you don't need a waste time thinking about it now you don't need to agree with me on all the points okay but just remember one point if you cannot remember any of the 8 points just remember one point consistency make sure that your API has consistency throughout all the endpoints and all the responses this picture have you anyone know of this story? the fall in the well so the fall in the well he thought my worst variable I can see the sky the sky and the clouds until one day come by then so the point of this is previously I was just a plain PHP developer just doing my own PHP recipe everything I don't know all this until I became a mobile developer and then I realised the pain points so actually sometimes it's not so good to actually just focus on one programming language sometimes you need to touch a bit on the other programming languages to see what they have and then pick the best points and also so that it can be and also so that it can work better with your other colleagues so with this that's the end of my talk thank you very much