<?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 Robyn on Medium]]></title>
        <description><![CDATA[Stories by Robyn on Medium]]></description>
        <link>https://medium.com/@deprogramm.r?source=rss-8a36558415a6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*2f8bZU9fMGXN4lhZWSEGuQ@2x.jpeg</url>
            <title>Stories by Robyn on Medium</title>
            <link>https://medium.com/@deprogramm.r?source=rss-8a36558415a6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 16:26:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@deprogramm.r/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[Documentation Technical Debt at Google]]></title>
            <link>https://medium.com/@deprogramm.r/documentation-technical-debt-at-google-218ec977e09d?source=rss-8a36558415a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/218ec977e09d</guid>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[onboarding]]></category>
            <category><![CDATA[technical-debt]]></category>
            <dc:creator><![CDATA[Robyn]]></dc:creator>
            <pubDate>Wed, 04 Oct 2023 12:13:56 GMT</pubDate>
            <atom:updated>2023-10-04T12:13:56.866Z</atom:updated>
            <content:encoded><![CDATA[<p>About my work as a software engineer at Google</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CTYiA3-jQ2nL4EtTtAXcKw.jpeg" /></figure><p>As a software engineer (SWE) at Google, I built ground-up machine learning-adjacent data engineering systems on Maps, maintained the legacy backend of Classroom during its largest period of growth, attained sole ownership of Classroom’s experimentation infrastructure, influenced changes to company-wide performance expectations, and lead two project teams to repay Classroom’s 10-year documentation technical debt.</p><p>The cost of gaps in documentation accrues interest over time — relative to what percent of the underlying system is proprietary (i.e., not open source). In the worst case scenario — development velocity suffers, SWE hours (time spent on engineering projects) are inefficiently redirected to 1:1 mentoring/interruptions, onboarding is prolonged, morale suffers, and retention plummets — each a reality at Google. Considering the high cost of SWE hours, documentation tech debt costs millions to a company annually on a team with as few as 10 senior SWEs.</p><p>Working on an entirely proprietary codebase like Google’s makes documentation technical debt a uniquely challenging problem. 100% proprietary means that the available documentation is only as sufficient as what exists internally. That, combined with failure to reward documentation efforts as engineering work, leads to lack of incentive to prioritize such efforts. This contributes to a culture of secrecy in which information crucial to completing assigned work is hoarded by single points of failure, making it difficult to efficiently allocate SWE resources and nearly impossible to offer junior-level SWE job opportunities.</p><p>Unlike other forms of tech debt, documentation is infrastructure exclusively designed for humans, not a compiler, with the goal of making humans exponentially more productive. Understanding the problem at Google meant understanding how it impacted its employees. So I leveraged the connections I built through involvement in ERGs, community outreach, attending social events, and participating in team building exercises to have important conversations on the personal impact of the documentation gap. I shared my experiences authentically and listened to my colleagues’. The most profound thing I discovered wasn’t the unanimous consensus about the problem; it was how the problem caused crippling imposter syndrome in colleagues who felt too vulnerable to address it to leadership.</p><p>In 2020, Classroom, despite being a legacy codebase, was suddenly thrust into the spotlight as it became a utility for students accessing education remotely all over the world due to covid-19 lockdowns. MAU exploded. In Summer 2020, I jumped at the prestigious opportunity to switch teams from Maps data engineering to Classroom backend.</p><p>On Classroom, I influenced prioritization of two adjacent projects — one at the org level, the other on the backend team — and led the engineering efforts for each 6-person team.</p><p>At the org-level, I designed the hierarchical taxonomy for the content’s cumulative curriculum, defined technical nomenclature, tracked down cryptic information from senior SWEs, documented processes, instructed leadership on collection of metrics, and created standards for writing the content tailored to a very specific audience: newly hired junior SWEs.</p><p>I led the engineering efforts at the org-level for 4 months and delivered the finished documentation ahead of the onboarding of 15 new team members in March 2022, the majority being new hire junior SWEs.</p><p>Simultaneously, I led the effort to document the backend team’s codebase in the form of weekly presentations that we recorded and shared org-wide. I scoped the work, developed the curriculum, led meetings to mentor leadership on technical writing best practices, collaboratively implemented the content, created diagrams to represent abstract server components, defined backend nomenclature, designed plans for long-term maintenance, and was responsible for reviewing content contributions from my team members.</p><p>In conjunction, I developed a management approach to scale mentoring new SWEs and improve productivity. I restructured open-ended twice weekly team meetings to be agenda-driven Q&amp;A sessions where team members scheduled a question in a shared doc ahead of time to be answered by the rest of the team collaboratively. When first implementing, I was in charge of running the meetings and assigning a scribe. The meetings were widely popular, efficient, and eliminated costly reliance on 1:1 mentoring.</p><p>At my direction, we collected metrics in the form of surveys and feedback. Documentation seeks to improve human productivity, a metric which cannot be isolated independently in lines of code submitted. Aside from the number of clicks and minutes accessed on the docs (in addition to attendance numbers during presentations), we focused on analyzing subjective feedback. One example, we compared onboarding experiences of new hires to that of existing SWEs who had joined prior to the documentation effort. Objective metrics were used to compare length of onboarding of the two groups. That is, the length of time it took since joining the team for a SWE to acquire the skills and knowledge necessary to confidently and independently work on assigned projects.</p><p>Our goal was to reduce onboarding time, maintain development velocity for existing SWEs simultaneously, and improve employee morale.</p><p>The impact exceeded expectations. Onboarding for newly hired junior SWEs decreased from up to 6 months to 1–2 weeks. Employee morale skyrocketed as engineers felt confident in their ability to work independently and effectively communicate when asking a question. Development velocity not only was maintained, but increased. Reliance on 1:1 mentoring decreased. For the first time, retention improved.</p><p>Annually, the impact of solving documentation technical debt within one org resulted in millions saved for an entire company.</p><p>“Culture is what you reward” (-unknown), so I influenced a company-wide paradigm shift on how documentation is rewarded. My legacy was seeing a 3-year initiative come to fruition: documentation becoming an explicit performance expectation for all SWEs company-wide.</p><p>At Google, I developed a systematic, empathetic approach to leading innovative solutions for long-term maintenance of legacy software, influencing decision making, and connecting with and inspiring colleagues. I helped Google achieve its goals by furthering the productivity of others, coming up with the big ideas, leading others in the execution of those ideas, taking ownership of challenging infrastructure, and improving communication between stakeholders and SWEs. I hope to bring those skills and experiences to my next opportunity.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=218ec977e09d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Project Summary: Android Internship at a VR Startup]]></title>
            <link>https://medium.com/@deprogramm.r/project-summary-android-internship-at-a-vr-startup-f30ee3a6ef65?source=rss-8a36558415a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/f30ee3a6ef65</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[vr]]></category>
            <dc:creator><![CDATA[Robyn]]></dc:creator>
            <pubDate>Sun, 08 Jul 2018 20:50:49 GMT</pubDate>
            <atom:updated>2018-07-10T21:26:59.766Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gJoB5VNBCjdLvgqLL6yYAg.jpeg" /></figure><p>A couple days after my 28th birthday, I received my first full-time offer since completing my Master of Science in Computer Science. The position was for a 3-month internship at <a href="https://floreotech.com/">Floreo</a>, a Washington, D.C.-based startup creating mobile virtual reality applications that help people with autism.</p><p>Although my job title was only “Software Engineer Intern,” my responsibility was that of “Lead Android Developer.” I was tasked with building the entire Android mobile application, from scratch! When I started my internship February 1, 2018, the application had been built for iOS mobile, which paired wirelessly with an iPad so that the VR experience could be monitored. From the iOS mobile codebase, I had to translate the equivalent code for Android. The end goal was to have a fully functioning Android app for mobile that loads the VR graphics and pairs wirelessly with an iPad monitor device.</p><p>Mission accomplished. Here’s how I did it:</p><h3>Model — View — Controller Architecture</h3><p>Model-View-Controller (MVP) is an architectural pattern for structuring code within a program. MVP is the separation of code components: the <em>model</em>, which is the data that your app uses, is separated from the <em>view</em>, which is the code that designs the app’s UI, and both of which are separated from the <em>controller</em>, which is the code that manipulates the UI.</p><p>I followed the MVP conventions while designing the architecture for the project.</p><p><strong>Models</strong></p><p>The models are defined as regular Java classes. Each individual class has a unique name and defines a new type of data model. The purpose of a model class is to provide a template for constructing data and for storing that data in main memory.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8mdsa7xaQnmuZFSXshW1Ow.png" /><figcaption>The project navigator (left) and a sample model class (right) with a diagram of the memory representation for instances of the Model class.</figcaption></figure><p>As shown in the project navigator image above, I encapsulated the model data files within a directory named “model”. Each subdirectory contains one or more Java files used for a particular purpose. For instance, the “loginResponse” directory contains model Java classes used to form the response data returned by the server after making a login network request.</p><p><strong>Views</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kxoBt7LWFu4J5f4srFQqDA.png" /><figcaption>The project navigator (left) shows the list of XML files each representing a view. The activity_landing_page.xml (right) shows the code for the screen shown when the app is launched and a preview of that screen.</figcaption></figure><p>The views are made up of XML layout files, which define how the UI should look. A view contains the code for designing the actual appearance that the user will see on the screen. In general, each individual XML layout file represents one distinct screen that will appear on the user’s device. The XML file contains references to any images (e.g., .png files), buttons, formatting, styles, colors, and text for designing that particular screen.</p><p><strong>Controllers</strong></p><p>A controller is a special type of Java class, called an Activity class, which corresponds to an individual XML layout file. Within the code for every Android application, there’s a special file called the AndroidManifest which provides a list of all the app’s Activity classes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HOAZD52yAGVDByY6jO1NlA.png" /><figcaption>The project navigator (left) shows the subdirectories that contain the controller Activity classes. The LandingPageActivity (right) shows the .java file for the code that controls the activity_landing_page.xml view. The magnified line of code (bottom-left) sets the view that will be shown on screen whenever the app navigates to this controller. The diagram (bottom-right) shows the memory representation for an instance of this Activity class.</figcaption></figure><p>In the AndroidManifest, I declared the LandingPageActivity as the activity whose code will be executed first whenever the app is launched. As you can see from the line of code at the bottom, the activity class specifies which View to show on the UI. It also contains all the logic for what instructions to do while the landing page is being shown on the device, as well as code for navigating to the next activity class once this one is complete.</p><h3>UI Navigation</h3><p>My goal for the app’s UI navigation was to mimic the appearance and flow of the Floreo iOS app’s authentication, login, game play, and pairing.</p><p><strong>Authentication</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tkzKg5hjcC-e0sc9W_CjQQ.gif" /></figure><ol><li>The user launches the app and sees the <em>LandingPageActivity</em>.</li><li>After 2 seconds, the app navigates to the <em>RegistrationCheckActivity</em>.</li><li>The <em>RegistrationCheckActivity</em> waits for the user to input their email and tap the ‘Next’ button. Behind the scenes, a network request is initiated to determine whether the user’s email has been beta-approved.</li><li>If so, the app navigates to the <em>CreateUserAccountActivity</em>.</li><li>Otherwise, the app navigates to the <em>RegistrationRequestActivity</em>.</li></ol><p><strong>Login</strong></p><p>There are a few paths the app can take to navigate to the <em>LoginActivity</em> from the <em>RegistrationCheckActivity.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FpJM2yi7L2dNBEt4hwqLvQ.gif" /></figure><ol><li>First, if the user accidentally initiates a registration check network request but the user already has an account, then…</li><li>the app will navigate to the <em>LoginActivity</em>.</li><li>Second, after a beta-approved user…</li><li>creates their account,</li><li>the app will navigate to the <em>LoginActivity</em>.</li><li>Last, is when a registered user simply taps the ‘Sign in’ link on the <em>RegistrationCheckActivity</em>.</li><li>The user enters their login credentials and taps the ‘Login’ button, which initiates the login network request.</li></ol><p><strong>Game Play &amp; Pairing</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9sw3ttTYoauYVmYFrjkLKw.gif" /></figure><ol><li>After the user successfully logs in, the app navigates from the <em>LoginActivity</em> to the <em>PlayerManagementActivity</em>, which displays the list of players to the user.</li><li>The UI list is populated with the list of players retrieved from the get players network request.</li><li>The list gets populated with data defined by the model <em>Player</em> java class.</li><li>When the user taps on a player in the UI list,</li><li>the app navigates to the <em>WaitForMonitorActivity</em>, which shows a progress bar as, behind the scenes, network requests are made to pair the device to a monitor iPad.</li></ol><h3>Persisting Data</h3><p><strong>Shared Preferences</strong></p><p>To persist data between a user’s sessions, I used Android’s <em>SharedPreferences</em> library. <em>SharedPreferences</em> allows data to be saved to a file on the user’s device as a key-value store, which can be read or written to during future launches launches of the app.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C3iRXq2aXgKVMLjrKV6xlQ.gif" /></figure><ol><li>The user first launches the app, enters their login credentials, and taps ‘Login’.</li><li>If successful, the encryption function is called, passing in the user’s login credentials.</li><li>The encryption function returns encrypted values for the login credentials.</li><li>Next, a function is called to retrieve the device ID.</li><li>Last, a function is called to persist the encrypted login credentials, which stores appended versions of the device ID string as they keys for the user’s encrypted login and password.</li></ol><p>When the user launches the app in the future and tries to navigate to the <em>LoginActivity</em>, the device first checks for the <em>SharedPreferences</em> file on the device. If it exists, the app uses the device ID to look-up and retrieve each login credential, decrypts them, and automatically logs in the user.</p><h3>Non-UI Operations</h3><p><strong>Util Classes</strong></p><p>To keep with best programming practices, I cleaned up the code. First, I refactored methods in my activity classes that didn’t need to be declared within the context of an activity. Second, I created a separate java class, which I called a Util class.</p><p>A Util class it a class that is not an Android activity. This means that the class doesn’t correspond to a UI XML layout file, nor does it serve as a template for instantiating objects. A Util class is simply a class that contains a series of functions, each of which performs some task.</p><p>After creating Util.java, I then moved the <em>encrypt()</em>, <em>getDeviceId()</em>, and <em>persistData() </em>functions into the Util class.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-HDnGZdU_NYphAYQW-fOPg.gif" /></figure><p>The benefit of doing this is that these functions are now available to all the other classes and activities. Instead of redefining these functions in each activity, I can define them once in Util.java, and then reuse them as needed throughout the rest of the project.</p><h3>Networking</h3><p>A majority of time during the course of my internship was writing the code for performing network requests and handling the responses from the server. Here are the types of requests that the app makes:<br>- Login,<br>- Refresh login session,<br>- Check account status,<br>- Create account,<br>- Get players,<br>- Post ticket for device pairing,<br>- Claim ticket for device pairing, and <br>- Report events.</p><p>The goal of the networking code is efficiency. The code must take the device hardware into account by optimizing for concurrency. To accomplish this, my networking code evolved over a series of approaches.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aPFXNVDuK57eBsT94sHnww.png" /><figcaption>The diagram is a representation of a LoginActivity instance and its AsyncTask instance in memory, as well as the relationship between the two instances. LoginActivity kicks off the AsyncTask, and the AsyncTask holds a reference to the calling activity class.</figcaption></figure><p><strong>Naive Approach 1: Subclass AsyncTask</strong></p><p>My first approach was to subclass AsyncTask for making the network requests. AsyncTask is used to perform non-UI operations in a background thread. I wrote out the entire code for making the network requests, handling the server response, parsing the JSON, and providing the results to the Activity that initiated the request.</p><p><strong>Naive Approach 2: Networking Library and Subclass AsyncTask</strong></p><p>My second approach was to use a third party libraries for making network requests and parsing the JSON responses. I used the Retrofit 2.0 library for kicking off the requests and handling the callbacks for the responses. I also used the Gson converter library for parsing the JSON and turning the response into model data objects.</p><p>I accomplished this by creating a Floreo API (FLAPI) class that defines the method signatures for the entire suite of methods that kick of network requests. Each of those methods was then implemented in the AsyncTask subclass.</p><p><strong>Problem: Memory Leaks &amp; Unused Resources</strong></p><p>When using AsyncTask for handling background operations, the AsyncTask stores a reference to the activity class that initiated it. By storing a reference to an activity class, my code was vulnerable to potential problems: memory leaks and unused memory resources.</p><p>As an example:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YxZs1cIzI4-tH_4JtMuq2g.gif" /><figcaption>Each configuration change leads to the destruction and creation of instances in memory.</figcaption></figure><ol><li>The user navigates to the LoginActivity, and so the device stores the activity instance in main memory.</li><li>When the user enters their credentials and taps the Login button, an AsyncTask is created. A background thread is initiated for performing the login network request and the AsyncTask instance is stored in main memory. The AsyncTask holds a reference to the calling LoginActivity instance.</li><li>Suppose a configuration change occurs, such as when the user rotates the device from portrait to landscape. Then, the LoginActivity instance is destroyed in main memory.</li><li>The configuration change causes a new LoginActivity instance to be created. Suppose the AsyncTask has not yet completed. This scenario leads to a memory leak since the AsyncTask still has a reference to the original, nonexistent LoginActivity instance, which causes the app to crash.</li><li>From configuration change, if the user were to tap on the Login button again, another AsyncTask would be created and stored in memory, which means the app is using more memory resources than necessary.</li></ol><p><strong>Solution: RxJava and RxAndroid Libraries</strong></p><p>RxJava is a reactive library that follows the functional programming paradigm. Instead of subclassing AsyncTask or writing messy threading code, RxJava simplifies the process of asynchronous tasks without blocking the main thread. The building blocks of RxJava are O<em>bservables</em> and S<em>ubscribers</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aP5ZEvG_C1zbKRkYO-FYgg.png" /></figure><p>The <em>Observable</em> emits data asynchronously and the <em>Subscriber</em> consumes that data. The <em>subscribeOn()</em> method instructs the O<em>bservable</em> as to which thread to emit the data stream on. Upon completion, the <em>observeOn()</em> method emits the data to the specified thread, which in my case, is the main UI thread.</p><h3>Design Patterns</h3><p><strong>Singleton</strong></p><p>Throughout a user’s entire experience from launch to close, the app relies on various pieces data, such as the login data, the session data, and the user’s device ID.</p><p>At first, any time an activity or thread needed to access such data, it would call a Util function. For instance, each time the app needed to access session data, it would retrieve the data from Shared Preferences, then call a decryption function, and then pass the decrypted credentials to the caller. This session data is required for almost every networking request that the app makes. This means that the code was not optimized since it was repeatedly performing the same operations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pGbuTbU46lIMD0qChad8YQ.gif" /></figure><p>Since the data is used throughout the entire app execution, and since that data only needs to be initialized once, I implemented the Singleton pattern. The operations to set the values are called once and then are only read accessible. As a result, after the data is instantiated, its values remain consistent throughout the app’s execution and can safely be read by any thread.</p><p><strong>UI Adapter</strong></p><p>After the user successfully logs in, the app performs the get players network request and navigates the user to the FLPlayerManagementActivity. The goal of the FLPlayerManagementActivity is to show the list of players.</p><p>To accomplish this, I implemented an adapter that abstracts the process of converting model Player objects into views that will be populated in the UI. The Adapter Pattern provides a uniform interface for incompatible class types.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TdR3C_PtpRwHta3WKlUhnQ.gif" /></figure><p>In my layout directory, I define two layout files: a layout file that corresponds to the FLPlayerManagementActivity which contains a ListView element and a list-item layout file that defines the layout for the individual items that will populate the ListView.</p><p>Here’s how it works:</p><p>After the list of players is retrieved from the network request, that list gets passed into the constructor for creating model PlayerAdapter data. PlayerAdapter subclasses BaseAdapter, which is an Android library used to populate a ListView with list-items by adapting a base list-item to the specifications defined in the list-item XML file.</p><p>Within the PlayerAdapter class, I defined a static class ViewHolder. The <em>getView()</em> method is called for each list-item when the list is currently in the foreground of the user’s screen. Within the <em>getView()</em> method, a ViewHolder object is declared and used as a placeholder. The ViewHolder then converts (or “adapts”) each base Player instance into an actual list-item object.</p><p>After the list becomes visible to the user, the activity waits for the user to select a player by tapping on one of the list-items. The super BaseAdapter class provides the methods needed to which which player list-item the user selects the ListView.</p><h3>Concurrency Optimization</h3><p>Although all the network requests were being processed on background threads, there was still room for improvement. A lot of the threading code was pretty messy, in that it used Handlers and Runnables.</p><p>Therefore, I focused a great deal of attention into analyzing and categorizing the types of network requests. My goals were to optimize for concurrency, reduce memory usage, and improve the user’s experience.</p><p><strong>Threads in Android</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m921_eqWPZNPH5bNhFrkIg.png" /></figure><p>The <em>main thread,</em> also known as the <em>UI thread</em>, executes all the activity code. It’s used throughout the lifetime of the app from launch to close.</p><p>The <em>background threads </em>are generally short-lived threads of execution used for non-UI purposes.</p><p>The developer is responsible for explicitly scheduling tasks on background threads. Otherwise, by default, the code operates on the UI thread. In comparison to the main thread, the lifetime of a background thread is usually shorter — it will be used to perform a task such as a network request and will terminate when the task completes.</p><p><strong>Categorizing the Network Requests</strong></p><p>Based on the, I categorized the network requests into three distinct types:</p><ol><li>Requests whose responses trigger changes in the UI</li><li>Requests whose responses trigger a subsequent request, and</li><li>Requests whose responses are irrelevant.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ucWJk-6NMdOiSIyIm08heQ.png" /></figure><p><strong>1 — Requests that Trigger UI Changes</strong></p><p>The login, get players, and get ticket requests fall into the first category. After the user logs in, the login network request is performed and if the response is successful, the app navigates to the FLPlayerManagementActivity and renders the corresponding XML layout.</p><p>Of the three categories, this type of request requires the most communication between the background and main threads. For this reason, I implemented subscribers and observables from RxJava and RxAndroid libraries to kick off the requests, convert the responses into model data, and then emit that data to the main thread as soon as its available.</p><p><strong>2 — Requests that Trigger Subsequent Requests</strong></p><p>The post ticket request falls into the second category. From the FLPlayerManagementActivity, when the user taps on a player list-item, the app kicks off a post ticket request in a background thread. As soon as that thread receives a response from the server, it kicks off a get ticket request.</p><p>Since the response for post ticket does not need to be provided to the UI thread, I used Android’s ThreadExecutor library. The post ticket request is made as a Retrofit 2.0 Call, which enqueues the Call. The response is then sent to the background thread and is never returned to the UI thread.</p><p>I used ThreadExecutor as a clean alternative to Handlers and Runnables. This allowed me to abstract the details of the background threading from the activity code.</p><p><strong>3 — Requests without Changes</strong></p><p>When the user selects a player from the ListView in FLPlayerManagementActivity, the app navigates to the UnityPlayerActivity and attempts to connect to the Unity engine. At this point, the app renders the VR graphics.</p><p>Because of the demands of the VR graphics, the app needs to periodically collect device data such as frame rate and battery percentage. As soon as the VR graphics render, I needed to collect the device data and send it to the server in the form of a report events network request. Because the server does not provide any meaningful data as a result of the request, and because the request does not lead to changes in the UI, the report events request falls into the third category of network requests.</p><p>I chose to use Android’s IntentService library for handling report events requests. A Service in Android is a component used for long-running, non-UI background tasks. I implemented a Started Service since, once initiated, the background operations would continue processing until the user closes the app. I set up my IntentService using a timer. After every 60 seconds, the service collects the device data and then makes a report events request to send that data to the server.</p><h3>Cross-Platform Communication</h3><p>In order to render the VR graphics, I had to learn how to make my Android app communicate with the Unity engine.</p><p>The first step was running Unity builds. Each update to the code required running a new build in Unity for Android. I added in the logic to the build scripts so that each build was equipped to support both iOS and Android. After the build script would complete, it would generate a new Android project that contained all the code I wrote and all the Unity code it needed to support it.</p><p>In Android, I had to add libraries to the Android Manifest file so that it could support the VR graphics. Then, within a series of Java files and Unity files, I set up methods that established the communication channel between the two different platforms. The cross-platform communication code contained the following: Java files containing methods called from Android, Java files containing methods called from Unity, and C# files in the Unity project that call the Android code.</p><p>When the user navigates to the UnityPlayerActivity and successfully pairs to the iPad monitor, Android calls to Unity to connect to the engine. Once connected, the graphics render and the user is able to experience a new world in VR.</p><h4>More where this came from</h4><p>This story is published in <a href="http://blog.usejournal.com/">Noteworthy</a>, where thousands come every day to learn about the people &amp; ideas shaping the products we love.</p><p>Follow our publication to see more product &amp; design stories featured by the <a href="https://usejournal.com/?utm_source=usejournal.com&amp;utm_medium=blog&amp;utm_campaign=guest_post">Journal</a> team.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f30ee3a6ef65" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[“I Want to Learn Programming but I Don’t Know where to Start”]]></title>
            <link>https://codeburst.io/i-want-to-learn-programming-but-i-dont-know-where-to-start-80dd2d55e1fd?source=rss-8a36558415a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/80dd2d55e1fd</guid>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[android]]></category>
            <dc:creator><![CDATA[Robyn]]></dc:creator>
            <pubDate>Mon, 11 Dec 2017 19:57:53 GMT</pubDate>
            <atom:updated>2018-04-07T21:42:13.662Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Z59x9C5cODVaFCIkFhQubQ.jpeg" /></figure><p>The objective of this article is to make learning programming accessible to anyone.</p><h3><strong>Frequently Asked Questions</strong></h3><p>As a mentor, I am constantly asked the following:</p><blockquote><em>“Which programming language should I learn if I’m new?”</em></blockquote><blockquote><em>“Which programming language is most in-demand for jobs?”</em></blockquote><blockquote><em>“What’s the most popular programming language?”</em></blockquote><h3><strong>Top Programming Languages</strong></h3><p>If you’re looking for an official ranking of the top programming languages, you can find it here: <a href="https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2017">IEEE Spectrum top programming languages</a></p><p>That list is great for checking whether a particular programming language is in use today. However, if you’re new to programming, I don’t recommend choosing a language solely based on a list.</p><h3><strong>How to choose a programming language</strong></h3><p>Computer science is an entirely cumulative field of study. That means, each successive topic builds off prior topics.</p><p>If you have previously attempted to learn programming (or any STEM field) in school, tried your best, but failed — you weren’t the problem. A good professor of any cumulative subject carefully curates the curriculum. Provided that each student has sufficiently prepared and satisfied the prerequisites, the expectations for the students’ prior knowledge should be clear. A good professor understands the expectations and assumes no knowledge beyond that scope. Anything outside of the expectations must be taught. Each topic in the curriculum is ordered sequentially, respective to the other topics.</p><p>When a subject is cumulative, meticulous attention must be paid when designing a course curriculum or learning path. With that said, don’t choose a language for its ranking; choose a language for which you have a complete learning path that makes no assumptions about prior knowledge.</p><h3><strong>A few words of advice</strong></h3><p>Before you begin learning how to code, it’s important to reflect on the point I made above: everything in computer science is cumulative.</p><p>I like to reiterate this because the biggest mistake you can make as an aspiring programmer is giving up because you don’t think you’re smart enough to learn programming. Learning to code has nothing to do with your intelligence. Yes, it’s difficult to learn programming, not because of who you are, but because there are a lot of topics to learn.</p><p>First rule, accept that the following scenario is going to happen: you’re introduced to a new topic that makes absolutely no sense to you.</p><p>That scenario is going to happen over and over again. How you handle that situation, each time it happens, is the only factor that will determine your success.</p><p>If the current topic you’re learning doesn’t make sense to you, stay where you are. Do not proceed to the next topic. To reiterate, the topics are cumulative. Skipping ahead is like trying to attach a roof to a house that lacks a frame, walls, and a foundation.</p><p>I find myself in this situation <strong>all the time</strong>. I often have to rewatch the same lecture of a video tutorial several times for me to grasp what I’m learning. Don’t get discouraged if you find yourself in my shoes.</p><p>If the tutorial (or book) you’re using didn’t sufficiently explain the topic, you’re going to have to find other resources that work for you. There’s no excuse for giving up just because your tutorial’s coverage of a topic didn’t work for you. You can find just about anything you’re looking to learn for free on YouTube. Figure out what to search for (e.g., [the topic] in [your programming language] + any other helpful keywords).</p><p>If you’re searching on YouTube for educational tutorials, check the stats first. Take a quick look at the rating and/or the view count. If you’re still unsure if a video is worth your time, read some of the comments to gage others’ opinions.</p><p>A lot of topics aren’t going to make sense the first time around. So, refrain from the negative self-thoughts.</p><p>The goal is to be conscious of your comprehension as you’re learning. As you progress through the learning path, you need to self-reflect. For each topic you cover, ask yourself questions such as:</p><ul><li>“Does this topic make sense to me?”</li><li>“Was there any new terminology? If so, was a formal definition provided for each new term?”</li><li>“Were there any new skills? Do I understand how each new skill is used in application? Can I demonstrate my understanding of this skill by solving practice problems?”</li><li>“Will I remember what I just learned tomorrow? And the day after? If not, how am I going to commit it to memory?”</li></ul><p>One last piece of advice: never underestimate the power of memorization. Memorization is a totally underutilized approach in learning. Yes, comprehension of a topic is the ultimate goal. However, comprehension may take time. If you are really struggling to grasp a topic, break down the topic and memorize the important terms. If you can’t comprehend how something works, your immediate goal should be memorization. If you need tips on how to tackle memorization, consider using the study card technique. You can read more about how I use this technique in my <a href="https://goo.gl/VqX1Dt">Interview Prep document</a>.</p><h3><strong>1 — Computer Science Fundamentals</strong></h3><p>The first step is learning computer science fundamentals, which I cover in my article: <a href="https://codeburst.io/intro-to-computer-science-terminology-f9ae64e75d27">Intro to Computer Science Terminology</a>. This article is written specifically with my audience in mind — everyone. I intentionally created this so that it is easy to understand for anyone with no background in computers.</p><p>The concepts covered in the article are predominantly definitional. You can casually read through the article, and that’s fine it that suffices for you. I recommend committing these terms to memory. Approach each term as though you’re in school and you need to be able to recall each term’s definition for an exam. You don’t have to commit yourself so thoroughly if you don’t want to. However, the more of these concepts that you can commit to memory, the easier it will be to understand later topics.</p><h3><strong>2 — Propositional Logic (optional)</strong></h3><p>No, you don’t have to be strong in math to be a programmer. Math skills can be helpful, but they’re not necessary.</p><p>If you’re insecure about your math abilities, I recommend learning propositional logic. The principles covered in propositional logic are the building blocks of programming.</p><p>You can learn propositional logic from this YouTube tutorial: <a href="https://www.youtube.com/watch?v=qV4htTfow-E&amp;list=PL619166130C21EADA">Basic Concepts in Propositional Logic</a>.</p><h3><strong>3 — Java Programming</strong></h3><p>After you’ve learned the basics of computer science, you’ll be ready to learn a programming language.</p><p>I have put a lot of thought and effort into designing a path that is suitable for everyone, regardless of their background. I chose Java for this learning path because Java is the language that I am most experienced in.</p><p>Java is one of the most in-demand programming languages. It’s classified as an object-oriented programming language (you’ll learn what this means later on) and it’s used to make desktop, web, and mobile applications.</p><p>If you prefer learning from a book, I recommend the following: <a href="https://www.amazon.com/gp/product/0596009208/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=programmr-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=0596009208&amp;linkId=368b405d998039a5dd14aa263621518e">Head First Java</a>.</p><p>If you’re looking for a video tutorial, I recommend watching videos #1–19, 31–33, 88, and 93 in the Java YouTube tutorial by Derek Banas: <a href="https://www.youtube.com/watch?v=TBWX97e1E9g&amp;list=PLE7E8B7F4856C9B19">Java Video Tutorial</a>.</p><p>The first video in the YouTube tutorial will direct you to download a computer program called <strong>Eclipse</strong>. Eclipse is an <strong>Integrated Development Environment</strong> (<strong>IDE</strong>). You can think of an <strong>IDE</strong> as a fancy term for a word editor that is made for programmers. It’s just a computer application that provides a text editor for programming, along with other tools for running your programs. Here’s the link to Derek Banas’s YouTube video on how to download Eclipse: <a href="https://www.youtube.com/watch?v=svJQu6LUSTs&amp;index=92&amp;list=PLE7E8B7F4856C9B19&amp;t=201s">Install Eclipse for Java</a>.</p><h3><strong>4 — Algorithms and Data Structures</strong></h3><p>An <strong>algorithm</strong> is a set of instructions (or steps) for performing a specific task, where each step must be clearly defined, capable of being executed, and finite (meaning, it doesn’t continue executing infinitely).</p><p>A <strong>data structure</strong> is a way of organizing data in memory.</p><p>Algorithms and data structures are two of the most challenging topics of programming. You don’t <em>need</em> to learn algorithms for basic competency in programming. However, if you aspire to work as a software engineer at a reputable tech company, you will be expected to demonstrate comprehension of algorithms and data structures during the interviews.</p><p>On a personal note, the tutorial below is what took my algorithm skills from novice to expert: <a href="https://www.udemy.com/break-away-coding-interviews-1/?couponCode=PROGRAMM.R">Udemy tutorial on Algorithms and Data Structures</a>. I’ve purchased a lot of tutorials on algorithms. This was by far the most comprehensive one that I’ve come across. Whether you want to learn algorithms and data structures or prepare for technical interviews, this tutorial is your best bet for success.</p><p>Note: the course is expensive, but essential. I was able to get in contact with the instructor, and she has generously offered a coupon code which reduces the cost from $50 to $10. The coupon code will be applied automatically when you click the link.</p><p>I recommend using the following tutorial alongside the Udemy tutorial: <a href="https://visualgo.net/en">VisuAlgo</a>. VisuAlgo is a free resource that shows visuals of how the values input into an algorithm change throughout its execution.</p><h3><strong>5— Android development</strong></h3><p>Android development is, in my opinion, one of the most fun applications of Java programming. Android apps are predominantly programmed in Java, so once you learn Java, you’re ready to learn Android.</p><p>Here is the best free video tutorial to start learning Android: <a href="https://classroom.udacity.com/courses/ud834">Udacity-Android Development for Beginners</a>.</p><p>After you complete the Udacity course above, you have a couple options where to go from there. There should be an extension to the above course that is taught by the same group of Google employees. The additional lectures should become visible once you get through the course (if you can’t find it, search for it on Udacity). That is a good option, especially since it’s free.</p><p>However, if you are willing to spend money on an outstanding book, I highly recommend the following: <a href="https://www.amazon.com/gp/product/1491974052/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=programmr-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=1491974052&amp;linkId=c8ecae3a3fe023f9d2fea94a51aaa8a6">Head First Android Development: A Brain-Friendly Guide</a>. This book gives detailed explanations and helpful visuals to really help you learn the underlying concepts of Android. Each chapter walks you through an example application. Everything is explained thoroughly, using words and diagrams that anyone can understand.</p><h3><strong>Helpful Resources</strong></h3><p><a href="https://stackoverflow.com/">Stack Overflow</a> is a website where programmers can get free help with their code. If you get stuck and want to ask a question, search for it first. If you can’t find your question, create an account and post the question yourself!</p><p>There are a ton of educational sites where you can find programming tutorials. Some of my favorites are <a href="https://www.codecademy.com/">Codecademy</a>, <a href="https://www.udemy.com/">Udemy</a>, <a href="https://www.udacity.com/">Udacity</a>, <a href="https://teamtreehouse.com/">Team Treehouse</a>, and <a href="https://www.khanacademy.org/">Khan Academy</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=80dd2d55e1fd" width="1" height="1" alt=""><hr><p><a href="https://codeburst.io/i-want-to-learn-programming-but-i-dont-know-where-to-start-80dd2d55e1fd">“I Want to Learn Programming but I Don’t Know where to Start”</a> was originally published in <a href="https://codeburst.io/">codeburst</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Intro to Computer Science Terminology]]></title>
            <link>https://codeburst.io/intro-to-computer-science-terminology-f9ae64e75d27?source=rss-8a36558415a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/f9ae64e75d27</guid>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[computer-science]]></category>
            <dc:creator><![CDATA[Robyn]]></dc:creator>
            <pubDate>Tue, 05 Dec 2017 20:02:41 GMT</pubDate>
            <atom:updated>2017-12-10T17:07:39.659Z</atom:updated>
            <content:encoded><![CDATA[<h3>Computer Science</h3><p>A complex definition: <strong>Computer Science</strong> is the study of information technology, processes, and their interactions with the world.</p><p>A simple definition: <strong>Computer Science</strong> is the study of using computers to solve problems.</p><h3>Computer Basics</h3><p>A <strong>computer</strong> is a machine that performs computations based on instructions.</p><p>A <strong>computer</strong> is made up of two components:</p><ul><li><em>hardware</em></li><li><em>software</em></li></ul><p><strong>Hardware</strong> consists of the physical components of your computer. If you can kick it, punch it, or pick it up to throw it, it’s hardware.</p><p><strong>Software</strong>, on the other hand, is not a physical component. Software consists of a set of instructions for the hardware. These instructions are typically saved in files on your computer. The instructions aren’t in English or any other spoken language; they are in a special type of language, called a <em>programming language</em>.</p><p>To sum it up, <strong>hardware</strong> is anything you can physically touch. <strong>Software</strong> provides the instructions that tell the hardware what to do.</p><p>A <strong>program</strong> is a synonym for a piece of software, or an application. In essence, it’s a file saved on your computer, written in a programming language, that contains instructions to tell the computer what to do when the program is launched.</p><p><strong>Code</strong> is a synonym for the “instructions” within a file. It’s also synonymous with software. “Code” is just a bunch of words and punctuation symbols within a computer program, written in a programming language.</p><h3>Computer Hardware</h3><p>To learn programming, you must first learn the basics of <strong>computer</strong> <strong>hardware</strong>.</p><p>The different components of computer hardware each serve various purposes.</p><p>There are 6 main components that make up a computer’s <strong>hardware</strong>:</p><ul><li>The <em>Central Processing Unit</em> (<em>CPU</em>)</li><li><em>Main Memory</em></li><li><em>Secondary Storage</em></li><li><em>Input/Output Devices</em> (<em>I/O Devices</em>)</li><li><em>Network</em></li><li><em>Bus</em></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/624/0*ueORdIhtV-aZQzkc." /></figure><p>The <strong>CPU</strong> is often called the “brain” of the computer. It is responsible for executing instructions, such as the code in a program.</p><p>The <strong>Main Memory</strong>, also referred to as “<strong>Random Access Memory”</strong> (<strong>RAM</strong>), is used to store: 1) the code from your programs and 2) the data that the code operates on while the program is actively running. When you open an application such as Microsoft Word on your computer, the code to run Microsoft Word gets loaded into <strong>main memory</strong>.</p><p><strong>Secondary Storage</strong> stores your programs and data when they are not actively being used.</p><p><strong>I/O Devices</strong> allow people to interact with the computer. I/O Devices allow people to input data into the computer (keyboard, mouse, microphone) or output data to the user (monitor, printer, speakers).</p><p>The <strong>Bus</strong> is a group of wires that connect the different hardware components. These wires allow data to be passed between the different hardware components. For instance, when you run a program on your computer, the bus sends the data (including the actual code of the program) stored in Secondary Storage to the Main Memory.</p><p>A <strong>Network</strong> allows your computer to connect to other computers around the world. Networks allow you to send and receive data from other computers, such as an email to or from a friend.</p><h3>Programming Terminology — Synonyms</h3><p>In general terms, you can think of each of the following three groupings of words as synonyms. While each can denote something that varies slightly, for your introductory understanding, you can think of the following as being equivalent:</p><ol><li>“code” = “computer instructions” = “software” = “program” = “app” = “application”</li><li>“coding” = “programming” = “software development” = “software engineering”</li><li>“programmer” = “coder” = “software developer” = “web developer” = “software engineer”</li></ol><h3>Machine Language vs. Programming Language</h3><p>Computers and humans represent and understand information in <em>different formats</em>.</p><p>Anytime you save <strong>data</strong> (such as a Word document) to you computer, the computer stores all the characters you type in a special format, called <strong>binary</strong>, also known as <strong>machine language</strong>.</p><p><strong>Binary</strong> is a language made up of combinations of 0s and 1s. Each character on your keyboard has a unique binary representation that distinguishes the character from the rest.</p><p>A <em>character</em> can be a letter, numerical digit, punctuation sign, symbol, space, next line return, tab, etc. Each character has a unique numerical code that distinguishes it from others. You can find out the numerical code (ASCII code) for each character by looking it up in an ASCII table, such as here: <a href="https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html">https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html</a></p><p>Notice that the character ‘A’ is separately distinguished from ‘a’.</p><p>‘A’ has the numerical code: 65</p><p>‘a’ has the numerical code: 97</p><p>This means, anytime the character ‘a’ appears in your document, your computer saves the data for it in the binary equivalent to the value 97.</p><p>Note that 97 is a human-readable format, which is called “<em>Decimal</em>” format. “Decimal” is the name of the format for numerical values represented in base-10, meaning that the digits 0–9 are used to form the values.</p><p>“Binary” format implies that the numerical values are represented in base-2, meaning that the digits 0 and 1 are used to form the values. That may sound pretty abstract, but you can surprisingly convert a decimal number to binary (and binary to decimal) using mathematical formulas. There’s no need to do this — this is just for your information. If you actually wanted to get the binary representation of a decimal number, you can use a calculator, such as: <a href="https://codebeautify.org/decimal-binary-converter">https://codebeautify.org/decimal-binary-converter</a></p><p>When you save your Word document and close your Word application, your computer actually saves your document in 0s and 1s. People designed computers to be efficiently used by humans. Since binary language isn’t an efficient means of communication for humans, it would not make sense for humans to see their Word documents in binary format. For that reason, when you later reopen your document, it will be translated from binary format and back into English (or whichever language you used).</p><p><strong>Binary</strong> (“<strong>machine language</strong>”) is referred to as a “<strong>low-level language</strong>.” It’s considered to be “low-level” because it is a language that machines understand.</p><p>Programmers type their programs in a <strong>programming language</strong>.</p><p>A <strong>programming language</strong> is referred to as a “<strong>high-level language</strong>” since it is a language that humans can read and understand.</p><p>Just like English, a programming language also has its own set of rules, or <strong>syntax</strong>. It also contains a set of defined words called <strong>keywords</strong> (or “reserved words”) that have a specific meaning when used in a program.</p><h3>Programming Paradigms</h3><p>Just as there are many different spoken languages that humans communicate in, there are also many different programming languages programmers use to create programs.</p><p>A programmer who knows several different programming languages will select the most appropriate programming language to use in each particular circumstance. For instance, there are programming languages that are more suitable for <em>web development</em> (making websites) and there are others that are more suitable for <em>mobile development</em> (making smartphone apps).</p><p>In addition to specifics such as the type of development, at a more granular level, programming languages are classified into different <strong>programming paradigms</strong>.</p><p>Here’s a simple definition for the word “paradigm.”</p><p>A <strong>paradigm</strong> is a way of thinking or a way of doing something. A paradigm is a mindset.</p><p>A <strong>programming paradigm</strong> is a way of classifying a programming language based on the style or methodology of programming.</p><p>Here are a few common types of <strong>programming paradigms</strong>:</p><ul><li>The <strong>functional</strong> programming paradigm</li><li>The <strong>procedural</strong> programming paradigm</li><li>The <strong>imperative</strong> programming paradigm</li><li>The <strong>object-oriented</strong> programming paradigm</li></ul><p>As an example, <em>Java</em> and <em>C</em> are examples of <em>programming languages</em>. The <em>Java programming language</em> is an example of an <strong>object-oriented</strong> programming language. The <em>C programming language</em> is an example of a <strong>procedural</strong> programming language.</p><p>For now, you don’t need to know what it means for a programming language to be classified as <strong>object-oriented</strong> or <strong>procedural</strong>. However, it just helps to understand that there are different classifications for the various programming languages.</p><h3>Writing and Saving Your Code</h3><p>The first step in the software process involves <strong>programming</strong>, which simply means to write <strong>code</strong>. A programmer writes code to create a <strong>program</strong>. A <strong>program</strong> is simply an <strong>application</strong> that does something, or achieves some goal, when the user of the application launches it. As the programmer, your goal is determine what you want your code to do, and to write the code.</p><p>When you want to write an essay, you use a computer application such as Word or any text editor. You simply open the text editor application, create a file, type in some text, and save your document in the desired file format, such as .docx or .pdf.</p><p>The process of writing code is similar.</p><p>You can write your code using a text editor or an <strong>Integrated Development Environment</strong> (<strong>IDE</strong>). An <strong>IDE</strong> is a computer application that contains all the tools you need to program, such as a text editor, a <em>compiler</em>, a <em>runtime environment</em>, and a <em>debugger</em>.</p><p>A <strong>debugger</strong> is a tool that programmers use to find mistakes in their code, called <strong>bugs</strong>. For instance, A bug may either prevent a program from <em>compiling</em>, prevent a program <em>executing</em> (running), or may cause a program to produce incorrect values. Learning how to debug a program is a skill that you will develop over the course of your professional life.</p><p>After you create your program, you must save your code within a <strong>file</strong>, called a <em>source file</em>. A <strong>source file</strong> is simply a file that contains <strong>source code</strong>, which is your program’s code. Saving your code within a source file requires naming the file with a <em>root name</em> and an <em>extension</em>. The <strong>root name</strong> is the unique name you choose to give your file, which is comprised of the characters appearing to the left of the <em>dot</em> (<strong>.</strong>) of your file name, and the <strong>extension</strong> is what appears to the right of the dot. You give the source file the extension expected according to the programming language of your source code. For instance, the extension <strong>.java</strong> is used for source files written in Java, whereas the extension <strong>.c</strong> is used for source files written in C.</p><h3>Compiling and Running Your Code</h3><p>Suppose you have written a program in the C programming language and saved your program as myprogram.c. Next, you will want to <em>run</em> your code to see if your program does what you had intended it to do.</p><p>Before you can run (“<em>execute</em>”) your code, your source file needs to be translated from C (the higher-level language) to a binary (the lower-level language) <em>executable file</em>. An <strong>executable file</strong> (or, “<strong>executable</strong>”) is a file that contains the binary translation of your code and, when launched, it will <strong>run</strong> (“<strong>execute</strong>”) your program. This translation process is called <em>Compilation</em>.</p><p><strong>Compiling</strong> is the process of translating source code within a source file from higher-level language into lower-level language, and then creating and saving that translated code in an executable file.</p><p>A <strong>compiler</strong> is a computer program used for compiling your code. It is a common tool included in an IDE. When using an IDE, the IDE may handle running the compiler program for you when you run your code. When you are not using an IDE, you will need to launch the compiler and specify the source file you would like it to compile for you.</p><p>If your program contains no bugs within the code, it will produce the executable, and the compilation process successfully completes. However, if your program contains one or more bugs, it may cause an error, preventing the compiler from producing the executable. If the compiler produces an error, you will need to go back through your code to debug it and correct the mistake(s).</p><p>Once you have successfully compiled your program, you can run (“launch” or “execute”) the executable, and your computer will execute the instructions of your program.</p><p><em>Note: a lot of these topics are covered in the following introductory textbook to C programming: </em><a href="https://www.amazon.com/gp/product/0201543222/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=programmr-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=0201543222&amp;linkId=718c0e2011054732c145cc4000e26715">The Art and Science of C, by Eric Roberts</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f9ae64e75d27" width="1" height="1" alt=""><hr><p><a href="https://codeburst.io/intro-to-computer-science-terminology-f9ae64e75d27">Intro to Computer Science Terminology</a> was originally published in <a href="https://codeburst.io/">codeburst</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Programmers Need to be Learning about Blockchain]]></title>
            <link>https://codeburst.io/why-programmers-need-to-be-learning-about-blockchain-f17fdeb17671?source=rss-8a36558415a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/f17fdeb17671</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Robyn]]></dc:creator>
            <pubDate>Mon, 04 Dec 2017 14:59:25 GMT</pubDate>
            <atom:updated>2017-12-06T22:59:08.716Z</atom:updated>
            <content:encoded><![CDATA[<p>Maybe you’ve missed your chance to turn a couple hundred dollars into millions with Bitcoin. Fear not — there are nearly one thousand other cryptocurrencies created since, many with real potential. As a developer though, the focus should not only be cryptocurrency investing. More important is blockchain, the software that powers cryptocurrencies and smart contracts.</p><p><strong>In simple terms, what is blockchain?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/223/0*ArzX2vDUuE3iRj1E." /><figcaption>Blockchain</figcaption></figure><p>Blockchain is a decentralized, distributed ledger of transactions (blocks), each of which holds a link to the previous block. Hence, the name “blockchain” refers to the linking or chaining of blocks.</p><p><strong>Centralized Transactions Economy</strong></p><p><a href="https://youtu.be/RplnSVTzvnU">This</a> TED Talks presented by Bettina Warburg on blockchain examines a brief history of the role uncertainty plays when making transactions. For instance, when purchasing a product, both the buyer and seller need assurances: that the other person is who she claims to be, that the product is as advertised, that the buyer compensates the seller, that the seller gives the buyer the product, and that there is recourse if any of the terms of the transaction are not met. Currently, our economy relies on institutions — banks, governments, and corporations — as central authorities to reduce uncertainty in transactions.</p><p><strong>Centralized Internet</strong></p><p>Our current model of the Internet is also a centralized system. Data is stored on web servers. When we want to receive data on the Internet, such as view a website or download a file, our web browser sends a request to the web server that hosts that data, and the web server responds to that request by providing the requested data. A centralized Internet is not fault tolerant: if a server goes down, the entire system is affected.</p><p><strong>In complex terms, what is blockchain?</strong></p><p>Blockchain is a cryptographically secure database containing an immutable history of transactions where each transaction contains a digital signature. A block’s digital signature is generated using a cryptographic hash function that links the new block to the previous block. In essence, it’s just a massive ledger of transaction history.</p><p><strong>Blockchain from a programmer’s perspective</strong></p><p>The following code snippets are based on <a href="https://youtu.be/baJYhYsHkLM">this</a> YouTube tutorial by YouTuber <a href="https://www.youtube.com/channel/UCrYmtJBtLdtm2ov84ulV-yg">Ivan on Tech</a> on how to code a simple blockchain in Java.</p><p>A Block object would store three fields: the previous block’s hash value, a string array containing the list of transactions, and its own hash value. A new block is created by passing in the previous block’s hash value and the array of transactions to the Block constructor. The block’s hash value is generated by passing in the previous hash value and the transactions array’s hash into the hash code function. The blockchain is immutable in that once constructed, its fields are encapsulated in the block and can only be accessed through getter methods.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/443/0*rYEsroYwV39cVsaG." /><figcaption>Block.java</figcaption></figure><p>A blockchain is simply represented as an ArrayList of blocks. The first block in the blockchain is called the genesis block. To construct the genesis block, we simply pass in 0 as the previous hash value along with the corresponding array of transactions. After constructing the genesis block, we add it to the blockchain. Then, the second block is constructed using the hash value of the genesis block and the transaction array.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/645/0*VcT6cqAz_9kgFX2m." /><figcaption>Test.java</figcaption></figure><p>Running this program produces the following output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/205/0*3Kx9NTXtfxcgtno3." /><figcaption>Output of Test.java</figcaption></figure><p>The idea is, a transaction cannot be altered once it has been created. Changing even just one character, such changing the genesis transaction from 10 coins to 100 coins, would generate entirely different output from the hash code function.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/479/0*YlLKTGa5dq4oJ3bG." /><figcaption>Modification to line 9 of Test.java</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/203/0*bNUpxpIpnzCILlz3." /><figcaption>Output for genesis after modifying line 9</figcaption></figure><p><strong>Decentralization through Blockchain</strong></p><p>The transaction history of a blockchain is stored across a peer-to-peer network of personal computers. These personal computers both utilize and facilitate the blockchain system, and no individual person or entity owns it. This makes the blockchain network both decentralized and distributed. Unlike in the client-server model, the blockchain does not have a single point of failure. Rather than a single entity providing assurances, transactions are validated by consensus across the network.</p><p><strong>Big companies are getting involved</strong></p><p>Blockchain technology has the potential to solve problems in the transactional economy. So it’s no surprise that blockchain has captured the attention of major banks and companies. Microsoft is one of many companies <a href="https://qz.com/989761/microsoft-msft-thinks-blockchain-tech-could-solve-one-of-the-internets-toughest-problems-digital-identities/">getting involved</a> in the Decentralized Identity Foundation (<a href="http://identity.foundation/">DIF</a>). The project’s mission is to solve problems related to online identity by using blockchain technology. This is just one of many examples. Currently, many companies, including IBM and Microsoft, are looking to hire blockchain developers. Read <a href="https://blockchaintrainingalliance.com/blogs/news/thinking-about-jumping-into-blockchain-for-2018-these-companies-already-made-the-leap">this</a> article to see a list of other companies getting involved in blockchain technology.</p><p><strong>Start Learning</strong></p><p>Check out <a href="https://blockchaintrainingalliance.com/">https://blockchaintrainingalliance.com/</a> to jumpstart your blockchain education.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f17fdeb17671" width="1" height="1" alt=""><hr><p><a href="https://codeburst.io/why-programmers-need-to-be-learning-about-blockchain-f17fdeb17671">Why Programmers Need to be Learning about Blockchain</a> was originally published in <a href="https://codeburst.io/">codeburst</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ANYONE Can Learn To Code — written by the Anti-version of the ex-Google Manifesto Employee]]></title>
            <link>https://medium.com/@deprogramm.r/anyone-can-learn-to-code-written-by-the-anti-version-of-the-ex-google-manifesto-employee-77e076e460bd?source=rss-8a36558415a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/77e076e460bd</guid>
            <dc:creator><![CDATA[Robyn]]></dc:creator>
            <pubDate>Fri, 11 Aug 2017 16:46:17 GMT</pubDate>
            <atom:updated>2017-08-11T16:46:17.427Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://www.linkedin.com/pulse/reality-check-anyone-can-learn-code-robyn-silber">Reality Check - ANYONE Can Learn To Code</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MAR2BMqNSXDVjC2JWk4f8A.jpeg" /></figure><p>Follow me on my coding journey on Instagram @ robynsilber</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=77e076e460bd" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>