<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Rhys Kentish on Medium]]></title>
        <description><![CDATA[Stories by Rhys Kentish on Medium]]></description>
        <link>https://medium.com/@rhyskentish?source=rss-ad14c8980ea8------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*mTrQ_CRr89pAYc3hwlhkYw.png</url>
            <title>Stories by Rhys Kentish on Medium</title>
            <link>https://medium.com/@rhyskentish?source=rss-ad14c8980ea8------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 18:59:57 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@rhyskentish/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Is it worth becoming a Software Engineer in 2024?]]></title>
            <link>https://rhyskentish.medium.com/is-it-worth-becoming-a-software-engineer-in-2024-d304a894543c?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/d304a894543c</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[jobs]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Tue, 01 Oct 2024 10:20:58 GMT</pubDate>
            <atom:updated>2024-10-01T10:20:58.739Z</atom:updated>
            <content:encoded><![CDATA[<h4>In this article, I’ll make the case for why the answer is “Yes, you absolutely should learn software engineering.”</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zF96bcdpCrKm2uxP" /><figcaption>Photo by <a href="https://unsplash.com/@emilep?utm_source=medium&amp;utm_medium=referral">Emile Perron</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>If a younger version of myself were transported to 2024, I know he’d be asking this question. I can only imagine the anxiety that young software engineers must be feeling about it. There are countless Reddit and Hacker News threads for aspiring developers discussing the topic.</p><h3>AI is a tool</h3><p>Will Software Engineer even be a job title in 5 years? 10 years? It shouldn’t be a surprise that people are asking this question in the context of the proliferation of generative AI. I believe that there will always be a need for at least some human oversight when it comes to AI code generation. The demand for talented engineers who exude creativity will always be there.</p><p>2025 will mark the 10-year anniversary of me starting Computer Science at university. When I first set foot in the markedly dark Kilburn building (there’s NO natural light — Manchester PLEASE install some windows!) I felt SO out of my depth. I didn’t even know what an ‘if’ statement was. A ‘variable’, also no idea. When it came to coding assignments, Google and StackOverflow were my best friends. Is generative AI used in this way so different? Possibly not, but there could be a risk of overreliance when it comes to learning with it.</p><p>A <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-part-2">survey</a> conducted by <a href="https://substack.com/@pragmaticengineer">Gergely Orosz</a> and <a href="https://substack.com/@hejelin">Elin Nilsson</a> explores this topic asking seasoned engineers. Some engineers are extremely bullish on the future of AI, most less so — one response states “Copilot is like pair programming with a junior programmer. I use it to do the rote work of filling in the details of my larger design”. Admittedly, I agree with this statement and think there is a short-term temptation for corporations to hire fewer junior developers. This is short-sighted. Junior engineers are so much more valuable than the code they write — their value lies in the fresh perspectives they bring, the candid questions they ask and the fact that you can mould them into the more senior engineers (and team members) that you eventually want to have.</p><h3>Where is the creativity?</h3><p>Large Language Models (LLMs) lack creativity, (at this moment) they can only output something they’ve seen before (i.e the dataset that they’ve been trained on). If their original data set is garbage then that’s all you’re going to get in the output. They can’t think; they just predict the next character (or phrase). This means they can’t solve novel problems that engineers encounter all the time, especially in abstraction and system design.</p><p>It’s easy to see where you can get stuck in a LLM training loop (e.g Garbage in, Garbage out. You may think “Why not just train on data before (say) 2022?”, to which I ask: “What happens when we run out of data??”. I think this is already our reality, and I think humans will be required to fix the mess.</p><p>As I previously mentioned, I am actually personally worried about the over-reliance from junior engineers (and to be honest, anyone) for learning with AI. Could we reach a point where juniors never learn the “correct” way to do something? I’m not sure what will happen in this case, but the goals of the big AI companies are to make sure their models are not trained on rubbish.</p><p>The fact that LLMs need to be trained means that they struggle with novel technologies, and they will often hallucinate but with confidence which makes it all the more dangerous. I don’t see a way around this problem currently, however, I’m sure a lot of people who are cleverer than me are working on it. At a recent developer meetup I attended, we were discussing whether we’ve witnessed the last new (human) written programming language. Maybe we have? That is a scary thought.</p><h3>It’s our duty to fix things</h3><p>Have you heard of the dead internet theory? It’s the theory that most of the activity on the internet is conducted by bots and most of the content is autogenerated by tools like LLMs. I alluded to it earlier in this blog post. A <a href="https://arxiv.org/pdf/2401.05749">recent study</a> (June 2024) conducted by researchers at AWS was literally called “A Shocking Amount of the Web is Machine Translated: Insights from Multi-Way Parallelism”. I’m not usually someone who buys into conspiracy theories; however, it seems we’ve passed the tipping point where the majority of content on the web is machine-generated. This is a great shame. I believe that LLMs lack creativity and I think it’s our duty to fix the internet.</p><p>Front and centre of this battle will be (are!) software engineers. Software engineers built the internet and they are continuing to build it. They’re building meaningful projects and equally they’re building silly stuff that means nothing! That truly is the beauty of the internet.</p><p>Here are some makers who are building stuff to make the internet feel alive again:</p><ul><li>Nolen (<a href="https://x.com/itseieio">@itseieio</a> on X, formerly Twitter) built <a href="https://onemillioncheckboxes.com/">One Million Checkboxes</a> — a fun little website that is literally one million checkboxes, the twist being it was a multiplayer experience. A box you check gets checked for everyone else. He was expecting a handful of people to try it but a tweet of his went viral, and in the end over 650 MILLION checkboxes were checked! Insane. <a href="https://eieio.games/nonsense/game-14-one-million-checkboxes">He’s written extensively about his experience building the site</a>, including an absolutely<a href="https://x.com/itseieio/status/1829268247105138764"> charming story</a> about finding secret messages and communities within the checkboxes. This is the best way to learn software engineering by the way — throw goofy projects out there as soon as you can, if people use them, fix the issues and scalability etc. I would wager that Nolen wouldn’t have even launched OMCB if he thought about scalability beforehand, this way he’s probably learned as much as years of experience of a 9 to 5 SE job would teach you.</li><li><a href="https://www.youtube.com/@Spu7Nix">Spu7Nix</a>’s <a href="https://www.youtube.com/watch?v=Qvlb-Yo6Rqo">“How I made a 3D Level in a 2D Game”</a> is another example of how ridiculous passion projects really resonate with the internet. He spent many months building a 3D level in geometry dash (a 2D platformer) using clever programming tricks. It’s hard to explain in writing but, I would highly recommend watching the video if you have a spare 20 minutes.</li><li><a href="https://x.com/jacobs_handle">Jacob Bartlett</a>’s “<a href="https://jacobbartlett.substack.com/p/my-toddler-loves-planes-so-i-built">My Toddler Loves Planes, So I Built Her A Radar</a>” is possibly the sweetest story in the Software Engineering space I’ve read. You can build such meaningful experiences for your loved ones if you learn software engineering. LLMs will never replace the creativity of humans.</li></ul><p>I won’t detail every example I find inspiring but here are a couple others -<a href="https://www.youtube.com/@JacobSucksAtCode">Jacob Binnie</a> (building a startup from scratch after having been fired and documenting it on YouTube), <a href="https://www.youtube.com/@ThinMatrix">ThinMatrix</a> (talented game developer making his games in his own game engine),</p><p>Partially inspired by the above I built my now fiancée an app to propose to her. It was a treasure hunt around London, visiting places that mean a lot to us, coupled with clue reveals from games inspired by the New York Times style games and Geoguessr. I’m so glad I built this little app. The day I proposed is one that we’re going to remember for the rest of our lives. Oh, she said yes by the way! <a href="https://www.youtube.com/@rhyskentish">Stay tuned</a>, I’ll tell the story in more detail very soon.</p><p>All of this to say: Build stupid things. Build meaningful things. Build things no one uses. Build things for yourself. Build things to change the world. Join the fight!</p><p>Admittedly, this article only stands as true in my mind as of writing this in September 2024. This space moves quickly and things can change, however, I do believe Software Engineers are and always will be artists. We are the architects of the silly internet, and you can be too. I think that is beautiful.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d304a894543c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ChatGPT, Bard and the ongoing AI wars]]></title>
            <link>https://rhyskentish.medium.com/chatgpt-bard-and-the-ongoing-ai-wars-5f64b2409442?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/5f64b2409442</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Thu, 09 Feb 2023 09:36:18 GMT</pubDate>
            <atom:updated>2023-02-09T09:36:18.865Z</atom:updated>
            <content:encoded><![CDATA[<h4>Why exactly did Google need to respond to OpenAI and what does this mean for the industry?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SiZU87J6KzZ6itD7" /><figcaption>Photo by <a href="https://unsplash.com/it/@deepmind?utm_source=medium&amp;utm_medium=referral">DeepMind</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>We are in the midst of the industrial revolution for Artificial Intelligence. The proliferation of AI services for consumers is something to behold. Google, in their recent announcement for Bard, makes reference to a study that postulates “<a href="https://arxiv.org/abs/2202.05924">the scale of the largest AI computations is doubling every six months far outpacing Moore’s Law</a>”. This level of progress is staggering and looks to only increase. In this blog we’re going to take a look at how some of these tools work, why Google needs to respond to OpenAI and Microsoft and what this means for the sector.</p><h3>What are Large Language Models, and how do they work?</h3><p>Large Language Models (LLMs) are models that are trained on billions of points of data in a particular language and attempt to predict the next word/sentence. ChatGPT is an example of a LLM. ChatGPT was trained using human feedback, you get it to generate multiple responses given a prompt, you show them to humans and the humans select the response they like the most. Instead of using this feedback directly, it’s used to train another model which tries to predict which future response a human would like more, this is then used as the reward function to train the LLM. The reward model allows training to scale as it imitates humans and thus does not require thousands of humans to train the LLM. The process is repeated, humans rank the new responses, that new information is used for training the reward model, etc. until the LLM is sufficiently trained in the task that you require.</p><p>There’s a flaw with this training system, the LLM is being trained on what response humans prefer rather than the factual information. ChatGPT is perhaps more likely to have a “stab” at predicting something that it doesn’t know rather than saying it doesn’t know as that’ll score more highly with the reward algorithm (and humans). I’m sure you’ve seen examples of where ChatGPT made up studies or where an obvious fact was wrong, sometimes quite humorously, this is the flaw in action. Could a solution to this give the model real-time access to information — Wikipedia for example (I can hear teachers saying “never quote Wikipedia”), cleverer people than me are addressing issues like this.</p><h3>Why did Google need to respond to OpenAI?</h3><p>Before the acquisition of OpenAI by Microsoft, Bing (Microsoft’s search engine) represented just <a href="https://www.statista.com/statistics/216573/worldwide-market-share-of-search-engines/">9% of all global web searches</a>. Now, OpenAI (Microsoft by proxy) obviously has first mover advantage in this market and the acquisition by Microsoft set off alarms at Google. This is maybe the first time there truly has been a threat to Google’s main revenue source, search. The ability to drill down into a response and clarify exactly what you mean instead of trawling through page upon page of google results could see the end of ‘search’ as we know it. Microsoft has <a href="https://techcrunch.com/2023/02/07/microsoft-launches-the-new-bing-with-chatgpt-built-in/">already announced</a> that they’re going to incorporate ChatGPT into Bing. It’s legitimate for Google to be concerned about OpenAI and other industry disruptors (I’d be surprised if the other industry megalodons haven’t been investing heavily in AI tools) as they risk losing the monopoly they have on search. They would go on to announce Bard, a direct competitor to ChatGPT. Google has also recently invested nearly half a billion dollars in Anthropic, another competitor to ChatGPT (incidentally started by former employees of OpenAI).</p><h3>Will Bard be better than ChatGPT?</h3><p>Other than the questionable choice of the name, we do not know what Bard will be like. In the announcement blog post, Google mentioned that they will initially be launching a smaller model but gave no indication of the size of that model. It’s important to note here that the size of the model doesn’t necessarily mean it will be “better”. As mentioned earlier, it could just mean the model is better at people pleasing. Google has been publishing immense progress in the Artificial intelligence sector however, <a href="https://google-research.github.io/seanet/musiclm/examples/">MusicLM</a> is a prime example of this. It seems that Google has made huge strides forward in this sector but has not mastered the commodification of it as OpenAI has. The competition will certainly drive innovation.</p><h3>What does all this mean for the computer programming industry?</h3><p>Google’s Deepmind’s mission is “Solving intelligence to advance science and benefit humanity”, aka solve intelligence, then solve everything else. I think in the immediate future (next 2 years) these AI tools will be just that; tools to help Engineers build, beyond that it’s difficult to see how advanced they’ll become and whether they actually will replace Software Engineers. Tools like ChatGPT and Github Copilot can already generate pretty robust code (although this depends on the training data again, provided buggy code the models will generate their own buggy code), it’s not hard to imagine for an AI to generate a whole website or mobile app complete with the Xcode build files etc. I wonder how far away from that we actually are.</p><p>If you want to go deeper into this subject here are a few videos I recommend:</p><ul><li><a href="https://www.youtube.com/watch?v=viJt_DXTfwA">ChatGPT with Rob Miles — Computerphile</a></li><li>Anything by <a href="https://www.youtube.com/@RobertMilesAI">Rob Miles</a> on this subject in fact</li><li><a href="https://youtu.be/Nh5i5obZ8OY">Google Panics Over ChatGPT [The AI Wars Have Begun]</a> — ColdFusion</li></ul><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/what-does-ongoing-ai-wars-mean-for-the-technology-sector"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5f64b2409442" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to customise Firebase In-App Messaging on iOS]]></title>
            <link>https://itnext.io/how-to-customise-firebase-in-app-messaging-on-ios-56594bac94dd?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/56594bac94dd</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[app-development]]></category>
            <category><![CDATA[in-app-messaging]]></category>
            <category><![CDATA[firebase]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Fri, 18 Nov 2022 10:33:05 GMT</pubDate>
            <atom:updated>2022-11-18T10:33:05.963Z</atom:updated>
            <content:encoded><![CDATA[<h4>Firebase offers an ‘out-the-box’ functionality to customise In-App Messages. But there is an easier way.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*CmHM-wP5xXN9596V" /><figcaption>Photo by <a href="https://unsplash.com/@lunarts?utm_source=medium&amp;utm_medium=referral">Volodymyr Hryshchenko</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>In-app Messages are messages you send to your users in response to actions they take in your app. This powerful functionality can increase engagement and customer buy-in. You could certainly imagine using these messages to drive a featured product or app personalisation. Firebase offers this functionality out of the box, however, it’s fairly complex to customise the behaviour of these messages.</p><p>The Firebase docs recommend editing the storyboard files in the library directly. Although this is fairly easy to do it comes with one notable drawback; you’d be unable to update the library without having the headache of migrating changes you make to the storyboard files.</p><p>But there is an alternative.</p><h3>Displaying custom messages</h3><p>Although Firebase has all the necessary functionality for the messages (including the analytical events), we found that the default had a certain “Google-y” look and feel which didn’t fit the brand of the app we were writing. So, we decided to create our own views which did match the brand. We discovered that we could implement “InAppMessagingDisplay” when importing “FirebaseInAppMessaging” which allowed us to decide what view to display in response to the type of message Firebase is wanting to show.</p><p>Here’s an example of how we did that:</p><p>We basically switch on the “type” of “InAppMessagingDisplayMessage”. It’s important not to forget the delegate methods here i.e when the message is displayed/dismissed calling the relevant functions to tell firebase X message has been displayed and dismissed, this allows Firebase to queue up messages and makes sure the subsequent messages are displayed correctly.</p><p>In creating our own custom views we have more control of when to show certain types of messages. For example, we wanted to improve the opt-in rate of people accepting notification permissions within the app, to do this we thought targeted messages in response to certain events (such as a purchase or a product coming back in stock) with custom wording reflecting the action taken would improve opt-in rate.</p><p>The problem here is that we wouldn’t want to show this message to users that had already opted into push notifications. Firebase wouldn’t know which users had opted in or not and so the out of the box messages wouldn’t be able to make this distinction.</p><p>In our new customised message manager, you can do this in a couple of ways. You could either check the status of the notifications when you see a certain URL in the action button, or check a certain field on the additional data fields within the message. Remember if you decide not to display a message you must call the dismiss function on the delegate to let Firebase know your app is ready to display another message.</p><p>Creating our own custom views unfortunately meant we had to rewrite the display logic of the views so the messages felt natural and would not just appear on the screen. When we display Cards, ImageOnly or Modal messages we grey out the background and animate the view appearing up from the bottom. This felt natural and inline with the UX of the app. For the banner we mimicked the behaviour of standard iOS notifications, the view appears at the top for a number of seconds before disappearing.</p><p>Given that we have now implemented “InAppMessagingDisplay” we are able to customise the messages we want to display to our hearts content.</p><p>A note on versioning; when we add new views/actions to respond to messages we have to be mindful of the version of the app that they exist in because they’d require a new release to display. We keep track via confluence of what message/action is in what version and make sure we only target that version in the console when setting up a new campaign.</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/what-is-the-best-way-to-customise-firebase-in-app-messaging-on-ios"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=56594bac94dd" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/how-to-customise-firebase-in-app-messaging-on-ios-56594bac94dd">How to customise Firebase In-App Messaging on iOS</a> was originally published in <a href="https://itnext.io/">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How To Create Pull Requests Which Are a Pleasure To Review?]]></title>
            <link>https://medium.com/better-programming/how-to-create-pull-requests-which-are-a-pleasure-to-review-d4ef46c63d07?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/d4ef46c63d07</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[git]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Wed, 20 Oct 2021 16:26:19 GMT</pubDate>
            <atom:updated>2021-10-20T16:26:19.583Z</atom:updated>
            <content:encoded><![CDATA[<h4>A few tools and templates to stay on top of pull requests</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Kn2cgpjyq4Ei08g0" /><figcaption>Photo by <a href="https://unsplash.com/@yancymin?utm_source=medium&amp;utm_medium=referral">Yancy Min</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>If you’re reading this blog post, you have probably felt the pain of a 4,000 line pull request with no description or context.</p><p>No one should roll their eyes and groan upon opening a pull request. If you share the belief that the onus of making them a pleasure to review is on the engineer putting up the pull request, read on.</p><h3>Pull Request Templates</h3><p>We’ve recently started using pull request templates at our company. Pull request templates provide a template for the engineer to fill in when writing a pull request.</p><p>We don’t enforce descriptions in pull requests however I’ve found if you include a template the engineer will likely fill the fields out and provide the reviewer with some context.</p><p>This is especially useful when you are reviewing a feature/project you’re not currently working on. To add a template to your project you’ll have to create a pull_request_template.md file, this can be visible at the root of your project or hidden inside a .github/ directory. Here’s the template we’ve adopted:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/682bb3ffd7ce6c17235b88e3aae5dd2b/href">https://medium.com/media/682bb3ffd7ce6c17235b88e3aae5dd2b/href</a></iframe><p>This template is useful as the engineer thinks about the change they’ve made in plain English, thus making the pull request clearer for the reviewer. More information about pull request templates can be found <a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository">here</a>.</p><h3>Restrictions on Pull Request Sizes</h3><p>Imposing a size limit makes pull requests more concise, and easier for the reviewer to digest meaning they may be able to catch any potential mistakes, using less effort.</p><p>The relationship between cognitive load and the size of the pull request is exponential — at a certain size, the reviewer won’t even read the code and bugs will slip through.</p><p>To combat this we’ve imposed a size limit of 400 lines of code on pull requests. Under this limit, we sometimes need to break down features into multiple pull requests (i.e SQ4–123-a, SQ4–123-b, SQ4–123-c, etc.) and have found code review more effective in doing so.</p><p>The commit history does become slightly messier however we feel it’s a worthy tradeoff; the less the reviewer has to think about, the more they’ll catch in the review.</p><p>A 400 line limit might not be right for your project. There’s an interesting tool <a href="https://www.pullrequest.com/blog/benchmarks-code-review-size/">here</a> which benchmarks your organization against others in the industry.</p><h3>What Tools To Use On GitHub</h3><p>There are several code pull request tools that make reviewing code that much easier. Here are a few of my favourites:</p><ol><li><a href="https://reviewable.io/">Reviewable</a> — This organises the review in a nicer UI than Github’s native view, it has plenty of keyboard shortcuts to aid when reviewing. You can also review by commit if you want using Reviewable.</li><li>GitHub.dev — Did you know that if you press . whilst on a GitHub repo you’ll be taken to a web version VSCode? This works for pull requests as well, you can clearly see all the files changed and make comments in IDE as you please.</li><li><a href="https://chrome.google.com/webstore/detail/better-pull-request-for-g/nfhdjopbhlggibjlimhdbogflgmbiahc?hl=en">Better Pull Request for GitHub</a> — Similar to above this chrome extension will let you browse the files changed in an IDE-like tree structure.</li><li><a href="https://github.com/marketplace/codacy">Codacy</a> — You’ll be able to remove mundane code review activities (such as code style) with this GitHub application which automates some aspects of code review.</li><li>Pre-commit/pre-push hooks using <a href="https://github.com/typicode/husky">Husky</a> — these tasks that are run locally before you commit or push code; they can do such things as run tests, run lint checkers and check commit messages and they’ll catch things that could have otherwise slipped through. This should simplify the code review for the reviewer.</li></ol><h3>Self-review</h3><p>It’s always worth considering; would you enjoy reviewing your own pull request?</p><p>This is a technique that I use personally. As silly as it seems, I pretend that I’m the reviewer and review the code I’ve pushed myself first before asking anyone else to.</p><p>I leave comments for myself and resolve them once I’ve fixed them. Even with all the tools I’ve written about above I still catch things in reviewing my own code. After that, I’ll then request a review from somebody else and hopefully, I’ve made it more pleasant for them, as well as reduced what could have been missed before it is merged in.</p><p>With these tools in your arsenal, you can make pull requests less painstaking, maybe even enjoyable, for the reviewer. If you have any more suggestions, please let us know. We love to hear and explore new ways to improve our process.</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/what-are-the-best-tools-to-use-for-pull-requests"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d4ef46c63d07" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/how-to-create-pull-requests-which-are-a-pleasure-to-review-d4ef46c63d07">How To Create Pull Requests Which Are a Pleasure To Review?</a> was originally published in <a href="https://betterprogramming.pub/">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Use Braintree Drop-In, Google Pay, and ThreeDSecure on Android]]></title>
            <link>https://medium.com/geekculture/how-to-use-braintree-drop-in-google-pay-and-threedsecure-on-android-2f8c710abb5f?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/2f8c710abb5f</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[google-pay]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[braintree]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Sat, 08 May 2021 05:02:44 GMT</pubDate>
            <atom:updated>2021-05-08T05:02:44.287Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*McHcrAq88haRgJwu" /><figcaption>Photo by <a href="https://unsplash.com/@mattykwong1?utm_source=medium&amp;utm_medium=referral">Matthew Kwong</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Using Google Pay and ThreeDSecure with the Braintree Drop-in UI returns a CardNonce instead of a GooglePaymentCardNonce. Here’s the solution to that</p><p>We were recently tasked with implementing a new payment integration using the Braintree Drop-In UI on one of <a href="https://www.brightec.co.uk/projects/trainsplit-rail-ticketing-app">our apps</a>. However, we ran into an issue when requesting ThreeDSecure using Google Pay.</p><p>ThreeDSecure provides an additional layer of security for online credit and debit card transactions, an essential protocol if you are processing card payments. Braintree offers an easy way to implement card payments as well as integration with ThreeDSecure. It also offers an equally straightforward way to implement Google Pay.</p><h3>Do you need ThreeDSecure with Google Pay?</h3><p>There are two types of card that can be used with Google Pay, PAN cards (non-network tokenized standard credit cards) and DPAN cards (network tokenized cards that have a generated virtual card with a device-specific account number). ThreeDSecure is not available with DPAN cards as they are considered already secure. However, you will need to implement it when using PAN cards. The Braintree drop-in UI detects the card type and will handle this implementation automatically if it detects a PAN card and you have requested ThreeDSecure. You can do this with the following Kotlin code:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ea25ca70c7e5ad9296bd8d142e142cd9/href">https://medium.com/media/ea25ca70c7e5ad9296bd8d142e142cd9/href</a></iframe><p>It is highly recommended that you use ThreeDSecure with PAN cards to improve their security.</p><h3>What did we do?</h3><p>We opted to go with the scenario where the user explicitly fills out their details (such as email and address) and we can then use this information to authorise the payment. We used this as an opportunity to measure the “quick checkout” conversion rate using Apple Pay on iOS (as Apple Pay does not require ThreeDSecure payments) to see whether moving away from the drop-in UI would be worth it. We anticipate that it will be and are also predicting to see an increased conversion rate.</p><p>All in all, the Braintree drop-in UI is extremely simple to use. However, you may have to compromise on the flexibility of the solution. Hopefully, this blog post will help people facing a similar situation and save them time when implementing ThreeDSecure and GooglePay.</p><h3>What went wrong?</h3><p>Unfortunately, we ran into an issue where the return type after completing a ThreeDSecure whilst using Google Pay. Normally the return type after completing a payment using Google pay without ThreeDSecure is a GooglePaymentCardNonce. This was not as we expected; it was a normal CardNonce when completing a payment using GooglePay and requesting ThreeDSecure. This meant that we lost the billing information that we needed to authorise the purchase.</p><p>We contacted Braintree and discovered that it was not currently possible for the drop-in UI to return a GooglePaymentCardNonce after completing ThreeDSecure. We would either have to explicitly get the user to provide their billing details (removing the option of a “quick checkout”) or move to Braintree’s hosted fields (a significant restructuring would be necessary to move away from the drop-in UI).</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/how-to-use-braintree-drop-in-google-pay-and-threedsecure-on-android"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2f8c710abb5f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/geekculture/how-to-use-braintree-drop-in-google-pay-and-threedsecure-on-android-2f8c710abb5f">How to Use Braintree Drop-In, Google Pay, and ThreeDSecure on Android</a> was originally published in <a href="https://medium.com/geekculture">Geek Culture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automate posting your Instagram photos on Reddit]]></title>
            <link>https://itnext.io/automate-posting-your-instagram-photos-on-reddit-35c1be19d1e6?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/35c1be19d1e6</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[instagram]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Tue, 02 Mar 2021 08:04:13 GMT</pubDate>
            <atom:updated>2021-03-02T08:04:13.994Z</atom:updated>
            <content:encoded><![CDATA[<h4>Automation is your friend.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SECpIFrjDD-b2wHJ" /><figcaption>Photo by <a href="https://unsplash.com/@agk42?utm_source=medium&amp;utm_medium=referral">Alex Knight</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>If you’re trying to grow your instagram, Reddit is a great way to get your posts in front of more eyes and build your audience. If you try to post manually it can take a large amount of time and effort. This is why I found a way to post to reddit every time you post to Instagram.</p><h3>The tools I use:</h3><ul><li>Later (allows you to schedule Instagram in advance, optional to post to Reddit — free plans available)</li><li><a href="https://www.postpone.app/?via=rhys">Postpone</a> (the program that publishes to reddit — this costs $10 a month and the link is an affiliate that I earn a small commission on)</li><li>Zapier (the program that links Instagram to postpone — this can be free if you don’t post much on instagram but can cost $25 a month if you post a fair amount)</li></ul><h3>The set up:</h3><h4>Step 1.</h4><p>Set up a Zapier account and create a new Zap. Call it something like insta to reddit.</p><h4>Step 2.</h4><p>Add the trigger “New Media Posted in My Account in Instagram” and connect your instagram account.</p><h4>Step 3.</h4><p>I caption my Instagram posts in such a way that I can extrapolate the first line to use a title on Reddit. To do this add the action “Run Javascript”. Name the input data caption and select the caption from the drop down. Add the following code in the code section:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/92d0dc023bc227f258b8b01a50c04681/href">https://medium.com/media/92d0dc023bc227f258b8b01a50c04681/href</a></iframe><p>This will output the first line of the caption and you will use it later on.</p><h4>Step 4. (Optional)</h4><p>Add the action “Text” select “Transform” and select Convert to ASCII. Select the input to be the caption that you just processed. Some subreddits have filters that automatically flag your post if your title is not in ASCII so this is a safety step.</p><h4>Step 5.</h4><p>Next you have to upload the image to Imgur. To do this you need to <a href="https://api.imgur.com/oauth2/addclient">register an application on Imgur</a>. Make a note of your Client ID as you’ll need this to upload an image to Imgur. Add another “Run Javascript” action. There’s two input fields here; imageUrl which is the media URL from the instagram action and the imageTitle from caption Run Javascript action. Paste the following code in the code field and replace &lt;IMGUR-CLIENT-ID&gt; with your Client ID.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2c7893718f6d62761052d00a2caace6c/href">https://medium.com/media/2c7893718f6d62761052d00a2caace6c/href</a></iframe><p>We upload the image to Imgur to ensure that Reddit displays the full image.</p><h4>Step 6.</h4><p>Finally add the “Schedule Reddit Post in Postpone for Reddit” Action (this is invite only from <a href="https://www.postpone.app/?via=rhys">Postpone</a>). Link your postpone account, add a relevant title for the subreddit you’re posting to, for example if you’re posting to r/ITAP they require the caption to be “ITAP of …” in our case it would be “ITAP of &lt;Caption from step 4&gt;”. Fill in the link section with the Data Link from the Imgur upload. Type the name of the subreddit you want to post to and the time you’d like to post e.g. “tomorrow at 1pm”(<a href="https://www.postpone.app/?via=rhys">Postpone</a> has a handy feature which averages when the previous top posts were posted for each subreddit if you need inspiration for when to post).</p><h4>Step 7.</h4><p>If the caption fits more than one subreddit then you can crosspost it to each in the above Action. Otherwise, you can add a second “Schedule Reddit Post in Postpone for Reddit” Action.</p><p>Using this method my posts have been upvoted 3500 times and have over 100 comments.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5YN6dXxcbgseMonkmsSkHQ.png" /><figcaption>Postpone all time stats</figcaption></figure><p>This can create a sense of community around your content and a great thing about reddit is that you don’t know what will get a lot of upvotes, there’s always a chance of going viral. If you’re an individual then this method may be slightly expensive however if you’re trying to grow a brand or would like more eyeballs on your work then this is a perfect fit.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35c1be19d1e6" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/automate-posting-your-instagram-photos-on-reddit-35c1be19d1e6">Automate posting your Instagram photos on Reddit</a> was originally published in <a href="https://itnext.io/">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to customise the Braintree dropin UI in React Native]]></title>
            <link>https://itnext.io/how-to-customise-the-braintree-dropin-ui-in-react-native-846364727dff?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/846364727dff</guid>
            <category><![CDATA[ui]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[braintree]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[react-native]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Wed, 16 Dec 2020 11:22:58 GMT</pubDate>
            <atom:updated>2021-04-08T08:54:31.693Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Vc5GKoZq-cWqRTlo" /><figcaption>Photo by <a href="https://unsplash.com/@servuspaul?utm_source=medium&amp;utm_medium=referral">Paul Felberbauer</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>React Native is a solid, tangible solution to develop an application at speed as 90–95% of the code will be shared across platforms.</p><p>Today we’re talking about something that falls into the category of not being able to be shared.</p><p>In a recent React Native project, we decided to use the Braintree drop-in UI integration to handle payments as an easy win when you’re using Braintree. This a great library provided by braintree (and then ported by <a href="https://github.com/wgltony/react-native-braintree-dropin-ui">wgltony</a> to React Native) to save developers the need to build their own payment integrations. It’s easy to set up and get working for React Native by following the steps on the <a href="https://github.com/wgltony/react-native-braintree-dropin-ui">wgltony’s github repo</a>. The only downside of using this integration on React Native is that it’s potentially harder to customise the UI of it. You have to delve into the native code in order to do so.</p><h3>The Android Side</h3><p>To customise the look of the Android Braintree drop-in UI you have to overwrite the styles that braintree have defined in your own styles.xml. <a href="https://github.com/braintree/braintree-android-drop-in/blob/master/Drop-In/src/main/res/values/styles.xml">Here</a> is the list of styles you can overwrite. To do this you copy the style into your styles.xml, this can be found in the android/app/src/res/values directory. If it’s not there then you’ll have to create one following <a href="https://developer.android.com/guide/topics/ui/look-and-feel/themes">this guide</a>. For example if you’d like to add a bit of your app’s style to the add card activity you can do that in the following way:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5d1a0657207e46a9f289d92ed21bd534/href">https://medium.com/media/5d1a0657207e46a9f289d92ed21bd534/href</a></iframe><p>Our app’s style was a red app bar with a white title and the button’s text not all in caps. However, to recolour buttons you have to overwrite the colour that braintree has defined. In your android/app/src/res/values/colors.xml include the following:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c1acdcd662fe3d91d871a176b18d8b02/href">https://medium.com/media/c1acdcd662fe3d91d871a176b18d8b02/href</a></iframe><p>This is mentioned in the issues of the <a href="https://github.com/braintree/braintree-android-drop-in/issues/154">braintree android github</a>.</p><p>That code produces this layout:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/359/0*AsKDUixtYZu0lPak.png" /></figure><h3>How about iOS?</h3><p>The <a href="https://developers.braintreepayments.com/guides/drop-in/customization/ios/v4">documentation</a> surrounding how to customise the iOS braintree drop-in UI is more complete than that of Android but it’s still worth running through. You can customise a number of properties on iOS including:</p><ul><li>The text color</li><li>The overlay background colour</li><li>The navigation text colour</li><li>The form’s background colour</li><li>The navigation bar’s background colour</li></ul><p><a href="https://github.com/braintree/braintree-ios-drop-in/blob/master/BraintreeUIKit/Public/BTUIKAppearance.h">Here’s</a> a list of different properties which you can edit in iOS. You can set these properties before initialising the braintree UI. The following code snippet would give a similar look to the android version above:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/162aea8fba8ebc7a7fe2784af1348c65/href">https://medium.com/media/162aea8fba8ebc7a7fe2784af1348c65/href</a></iframe><p>All in all the braintree drop-in UI is an easy tool to use to handle payments. Customising it is fairly straightforward but requires some native knowledge when customising it on react-native.</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/how-to-customise-the-braintree-dropin-ui-in-react-native"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=846364727dff" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/how-to-customise-the-braintree-dropin-ui-in-react-native-846364727dff">How to customise the Braintree dropin UI in React Native</a> was originally published in <a href="https://itnext.io/">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Best games to play remotely during lockdown]]></title>
            <link>https://rhyskentish.medium.com/best-games-to-play-remotely-during-lockdown-754413a01756?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/754413a01756</guid>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[team-building]]></category>
            <category><![CDATA[games]]></category>
            <category><![CDATA[remote]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Tue, 10 Nov 2020 11:26:32 GMT</pubDate>
            <atom:updated>2020-11-12T17:28:31.603Z</atom:updated>
            <content:encoded><![CDATA[<h4><em>Feeling connected is key</em></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XYGR64UixIYYlg99" /><figcaption>Photo by <a href="https://unsplash.com/@sigmund?utm_source=medium&amp;utm_medium=referral">Sigmund</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>At Brightec we are colleagues but we are also friends. We value our connection as a team and whilst another lockdown means we can’t meet socially, or share lunch times in the same way, it hasn’t beaten our spirit. Since working remotely we’ve started a weekly catchup on Friday afternoons. The agenda is casual; we mostly play games as we’ve found it’s a relaxed and easy way to chat whilst having a focus which encourages more natural communication as it would around the lunch table. Here’s a list of our favourites:</p><h3>Among us</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/976/0*SV5UhSxOV2znvlWi" /></figure><p><a href="http://www.innersloth.com/gameAmongUs.php">Among us</a> has recently taken the internet by storm. It’s free to play on mobile or paid on PC. In this game you are little space beans attempting tasks to either repair your spaceship or base. But, there is an imposter (or two) who will try to kill you. Your job as a crewmate is to try and discover who the imposters are. If you are the imposter then your job is to kill all of the crewmates. Once a crewmate discovers a body they will report and discuss all their findings during the round. This discussion is where the fun comes from with the imposter trying to cover their tracks or frame other people and the crewmates playing detective. This is truly a great game to help the team feel connected and laugh together.</p><h3>Skribbl.io</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/0*qfsw8q3frrQ54zFQ" /></figure><p><a href="http://skribbl.io/">Skribbl.io</a> is a free drawing game. One person draws one thing of the three prompts and the other people try to guess. It’s best played on tablet or desktop and is especially fun when you are woeful at drawing (like me). We like to join a video call and chat throughout the game although admittedly it is mostly making fun of my drawings.</p><h3>SuperTuxKart</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/0*ZGYgPyYqsw03uQSC" /></figure><p>If you’ve played MarioKart in the past you will love <a href="https://supertuxkart.net/Main_Page">SuperTuxKart</a>. This free to play game is available on Mac, PC and Linux. It’s a great little game which is basically a budget MarioKart. There’s a huge selection of maps and there are a few different game modes. It’s full of nostalgia and a great game to play whilst on a video call. The soundtrack is banging too.</p><h3>Coup</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/950/0*g9qZ2MMO5ifWCT0k" /></figure><p>Coup is a bluffing card game. The aim is to be the last alive. You don’t know what cards your opponents have but you gather information throughout the game to determine what people have. However, your opponents can bluff and fool everyone. This game was one of our faves back in the office but we found that <a href="https://github.com/octachrome">Chris Brown </a>made<a href="https://coup.thebrown.net/"> an online version of the game</a>.</p><h3>Jackbox</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/616/0*hE-ef76P1teCgeyQ" /></figure><p><a href="https://www.jackboxgames.com/">Jackbox</a> is a collection of party games that work really well remotely. They have 7 party packs with 5 games in each pack. The prices vary but only the host has to pay. Our favourites are Quiplash, which requires you to come up with the funniest response to various prompts . We also like Trivia Murder Party where you answer obscure trivia questions interlaced with minigames.</p><p><a href="https://www.brightec.co.uk/blog/remote-team-activities">Checkout our other suggestions here.</a></p><p>If you have any more suggestions of games be sure to leave a comment and let us know. We’re always looking for new ones to play.</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/best-games-to-play-remotely-during-lockdown"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=754413a01756" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Firebase App Distribution vs Testflight]]></title>
            <link>https://itnext.io/firebase-app-distribution-vs-testflight-16ade1f6d349?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/16ade1f6d349</guid>
            <category><![CDATA[testflight]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[mobile-development]]></category>
            <category><![CDATA[firebase]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Wed, 07 Oct 2020 09:32:34 GMT</pubDate>
            <atom:updated>2020-10-08T14:35:12.919Z</atom:updated>
            <content:encoded><![CDATA[<h4>Testing mobile apps</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*92o-Frmo2yR9r47N" /><figcaption>Photo by <a href="https://unsplash.com/@nadineshaabana?utm_source=medium&amp;utm_medium=referral">Nadine Shaabana</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Perhaps the most important part of software development is acquiring feedback from users. There are multiple efficient ways to do this for mobile app development. Two of the most prevalent are Firebase App Distribution and Testflight. Here are the pros and cons of each and what we use them for.</p><h3>Testflight</h3><p>Testflight is Apple’s solution to distribute iOS apps to users that are willing to test your app. Being from Apple it was always going to be a streamlined, painless process, however there are still a couple drawbacks. Here are the main advantages:</p><ul><li>No provisioning profile steps for testers — this means it’s super easy to manage users.</li><li>Easy bug reporting/screenshot sharing features for testers built in.</li><li>Easy to open up to the whole community with the public sharing link.</li><li>No extra sign up.</li><li>If you’re happy after the testers have finished you’re able to submit to the App Store straight away.</li></ul><p>The main disadvantages are as follows:</p><ul><li>Need a (Beta) Apple review before new builds can be distributed — this is usually fairly quick but can take up to a week which can be frustrating.</li><li>Testers need to download the Testflight App.</li><li>Limited number of testers — although this is fairly large at 10,000 users, larger companies could potentially need a fair few more.</li><li>Not cross platform — this is included as Firebase App distribution is cross platform.</li></ul><h3>Firebase App Distribution</h3><p>Firebase is Google’s suite of products catering to app development. App Distribution makes up part of this. It’s fairly easy to set up and useful for various reasons. Here are the main advantages:</p><ul><li>Test cross platform — meaning you can upload your Android APK and your iOS build to the same service and distribute them to the appropriate users.</li><li>There’s no limit to the number of users that can test the app.</li><li>Easy to implement if you already use Firebase analytics</li><li>Simpler to compare and manage different beta versions</li></ul><p>The main disadvantages are:</p><ul><li>Painful provisioning profile updating for new users — meaning you’ll have to update the iOS provisioning profile for each new user in order for the user to install your app.</li><li>Users have to create an account.</li><li>Extra Firebase libraries added to the project.</li><li>Not as seamless an experience as testflight.</li></ul><h3>Use cases</h3><p>We use both Firebase App Distribution and Testflight to gather user feedback, our internal policy is to use Firebase App Distribution when the app uses a staging or dev API as opposed to a live one. It’s an extra layer of security to ensure that we don’t accidentally publish an app that uses the wrong API.</p><p>You may be in a similar situation or you may prefer one over the other, both are tangible solutions to gather user feedback.</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/firebase-app-distribution-vs-testflight"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16ade1f6d349" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/firebase-app-distribution-vs-testflight-16ade1f6d349">Firebase App Distribution vs Testflight</a> was originally published in <a href="https://itnext.io/">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build a Mobile App From Scratch]]></title>
            <link>https://medium.com/swlh/build-a-mobile-app-from-scratch-e9623d373d11?source=rss-ad14c8980ea8------2</link>
            <guid isPermaLink="false">https://medium.com/p/e9623d373d11</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[app-development]]></category>
            <category><![CDATA[mobile-apps]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Rhys Kentish]]></dc:creator>
            <pubDate>Fri, 18 Sep 2020 15:18:45 GMT</pubDate>
            <atom:updated>2020-09-19T18:44:54.945Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pw6mUlWy4HoTl6dm" /><figcaption>Photo by <a href="https://unsplash.com/@williamtm?utm_source=medium&amp;utm_medium=referral">William Hook</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>I’ve been building mobile apps professionally for two years now, however I’ve only recently built an iOS app from scratch as a side project. This blog post is a summary of what I’ve learned and resources I used, I hope it will help or inspire you to get started on your own app.</p><h3>Starting strong</h3><p>Perhaps the most important part of the process is the beginning, this is where you’ll lay the foundations to ensure that the project is easy to come back to and a pleasure to work on.</p><h4>Wireframing</h4><p>With mobile apps I find it crucial not to develop blind, i.e you should have some idea of what you’re building and how it will look. To help with this you can do a quick sketch, either on paper or digitally. This helps inform what the entire app will look like. Below is a quick wireframe of the side project I was working on, an educational CBT app.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oMcbY8bc2HRhM4LX.png" /></figure><p>Here are some free resources to help you design a wireframe:</p><ul><li><a href="https://www.canva.com/en_gb/">Canva</a> (free digital design resource)</li><li><a href="https://color.adobe.com/create">Adobe Color</a> (free colour palette generator)</li><li><a href="https://www.autodraw.com/">Google Autodraw</a> (free icon generation)</li><li><a href="https://www.sketchize.com/">Sketchize</a> (free wireframe layouts)</li><li><a href="https://miro.com/">Miro</a> (a free collaborative whiteboarding resource)</li></ul><h4>Planning</h4><p>Once you have some idea of what you want to build then I suggest you break down the tasks you can think of into small manageable goals. This way you will avoid burnout and track progress efficiently. I recommend using <a href="http://trello.com/">Trello</a> to track these tasks (easter egg: put 🎉 in the done column and drag a task in there).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hcRn-vzdhBlyRHFr.png" /></figure><h3>Choice of technology</h3><p>At this point you’ll probably know what you want to write your app in but you may not know how to architect your app or what the backend will look like.</p><h4>Application Architecture</h4><p>The architecture of an application is important, it ensures that all the applications you write will be consistent, easy to work on and easy to pick up again. There are several architecture choices when it comes to native development, these have the goal of avoiding bloated classes (especially ViewControllers in iOS and Fragments/Activities in Android) and spaghetti code. Here’s a brief summary of a few that we’ve looked into at Brightec:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uWp7EPnAbIgAophC.png" /></figure><p>(MVP pattern <a href="https://medium.com/@ronanwhite/mvp-design-pattern-in-ios-3b99a40fcabd">source</a>)</p><p>The view represents a ViewController (or Fragment/Activity), the view is dumb (contains no business logic). The presenter addresses all UI events on behalf of the view (i.e what to display when) and calls the data methods in the model. There can only be one presenter for each view. The model represents the data portion or business logic of the app (the comms with the backend, processing data etc.). <a href="https://medium.com/cr8resume/make-you-hand-dirty-with-mvp-model-view-presenter-eab5b5c16e42">Here’s</a> a great blog post if you want to go more in depth with this pattern. This is the pattern we mostly use on iOS at Brightec, it’s also the pattern I used for the side project.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xW2vZyVZOBazxcYo.png" /></figure><p>(MVVM <a href="https://medium.com/@navdeepsingh_2336/creating-an-ios-app-with-mvvm-and-rxswift-in-minutes-b8800633d2e8">source</a>)</p><p>The model again represents the business logic of the app. The view in this case again represents a ViewController (or Fragment/Activity). The ViewModel is where this architecture differs from MVP, it can be used across multiple views. The ViewModel exposes streams of data that the view displays. The view subscribes to data events which are updated in the ViewModel. MVVM leverages the separation of concerns of MVP but also employs the advantage of data binding. This cuts down on the logic in the view. Brightec uses MVVM in its Android applications. To continue reading about MVVM, there’s a blog post <a href="https://medium.com/upday-devs/android-architecture-patterns-part-3-model-view-viewmodel-e7eeee76b73b">here</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lK-SD46Aik52mhY_.png" /></figure><p>(VIPER <a href="https://cheesecakelabs.com/blog/ios-project-architecture-using-viper/">source</a>)</p><p>By far the coolest architecture name. The view is the same as above. However, the presenter contains the view logic to display data, which it receives from the Interactor. It also contains the logic for reacting to user inputs, which it requests from the Interactor. The Interactor mediates the interaction between the Presenter and the data. The entity is a basic data model. The Router contains all the navigation logic. This is a further abstraction to MVVM and MVP as it separates the display and data logic of the presenter. Further reading is available <a href="https://www.raywenderlich.com/8440907-getting-started-with-the-viper-architecture-pattern">here</a> and <a href="https://www.objc.io/issues/13-architecture/viper/">here</a>.</p><h4>Backend technology choices</h4><p>I am no expert on backend/server development so this section is just my recommendation of free services to get you started if your application requires it.</p><p>Possibly the prominent free service you can use to get started is <a href="https://cloud.google.com/">Google Cloud Platform</a> (GCP). Google offers a plethora of services including serverless functions, dedicated services, databases, etc. We used a combination of <a href="https://cloud.google.com/functions">Google Cloud Functions</a> and <a href="https://cloud.google.com/appengine">Google App Engine</a> for the backend of a <a href="https://happy-track.app/">Slack app</a> we developed recently. GCP integrates with <a href="https://firebase.google.com/">Firebase</a> seamlessly. Firebase is a free collection of services that help developers build better apps. The services include; analytics, crashlytics, app distribution, cloud storage and many more. I exclusively used Firebase to power the backend of the side project I was working on as the free tier allows for a fairly generous number of interactions with the database.</p><p>There are alternatives out there like <a href="https://aws.amazon.com/">Amazon Web Services</a>, however I’ve not used this much.</p><h4>Communicating with the Backend</h4><p>If your application requires a backend then you’ll need to communicate with it. This would be the Model section of the above architectures. At Brightec we use the <a href="https://mobileinvader.com/repository-pattern-in-swift-with-realm/">repository pattern</a> to achieve this. There’s plenty of frameworks for storing data locally once you’ve retrieved it from your backend. Some examples are <a href="https://developer.android.com/topic/libraries/architecture/room">Room</a>, <a href="https://realm.io/">Realm</a> or <a href="https://www.sqlite.org/index.html">SQLite</a>.</p><p>You should now be equipped with tools necessary to develop your own mobile app from scratch. I’ll soon be writing about how to test an app you’ve made by yourself and the benefits of developing a side project so be sure to subscribe.</p><p><em>Originally published at </em><a href="https://www.brightec.co.uk/blog/build-a-mobile-app-from-scratchrh"><em>https://www.brightec.co.uk</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e9623d373d11" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/build-a-mobile-app-from-scratch-e9623d373d11">Build a Mobile App From Scratch</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>