Monday, February 20, 2023

Apprenticeship Pattern Blog 4

Chapter 4 of the apprenticeship mentions about developing new technical abilities, honing existing ones and building a strong foundation of technical knowledge. The authors mention that “The talented and hard-working apprenticeship must not become self-satisfied with his success”.  It is exciting to be proficient in a technology environment and build things while having fun with it, however, it’s more important that we do not become complacent in our abilities and stop learning about other frameworks. Versatility and flexibility are attitudes the craftsman should always possess. An example where I’m currently applying this is the containerization using Docker. For long I misinterpreted containerization to be the same as git version control but they’re actually different. In basic terms git is more about collaborating with others on a project while docker is more about applying the same development environment specifications across multiple end devices.
 
We also learn that the software craftsman should look out for opportunities to collaborate with exceptional developers in strong teams. Surrounding yourself with developers that are better than you helps identify areas you need to work on and introduces you to new ideas. I plan on attending coding hackathons in order to experience and see ideas other developers are working on.
 
The authors also mention about working on open-source software projects as a vital method for gaining technical knowledge. This also gives the opportunity to collaborate with seasoned engineers, learn about various technologies, and take part in a projects that will actually have an influence on the world. Newcomers start by contributing to simpler tasks as they learn and become more skilled, then slowly graduate to larger, more complex tasks. In Thea’s Food Pantry project, we’re continuing where other students left off. This is giving me an opinion of how future open-source projects could look like. We don’t have to start from scratch as the building blocks have already been put in place.
 
We also learn that humility and exposing our ignorance are great foundations of being a successful craftsman who's open and honest about what we don't know so we can learn from others.
 
To summarize the chapter, it goes like this: it’s important to continually learn and improve to gain the skills expected out of software craftsmen, to seek challenging projects, work on open-source projects and receive feedback and criticism from senior developers.

Monday, February 13, 2023

Apprenticeship Patterns Blog 3

Software development is a long-term pursuit that requires lifelong commitment towards learning and continuous improvements. This is what I learned from Chapter 3 from Dave’s story. His certificates were like medals that he had earned that showed his competence in the job he was doing. It’s interesting how after he collaborated face-to-face with exceptional software developers who were miles ahead of him and discovering that they kept on learning, he too started taking on side projects and reading anything he could get his hands on to be proficient in his crafts. I can relate this with the group that I'm currently working with, the scrum master is clearly ahead of us technically and I'm learning from him things that I didn't learn else where.
 
The chapter goes on to emphasize the importance of patience, persistence and having a long-term vision which I'll talk about later in this blog in the career of a software developer. Overtime software platforms and frameworks change, and this could lead to things breaking in several products. It’s therefore the developer’s responsibility to adapt to these changes and making the user’s experience seamless. An example I’ll give was the release of Angular 2, it was an overhaul of its predecessor Angular 1 which used vanilla JavaScript. Angular 2 on the other hand used TypeScript, a flavor of JavaScript with better performance, readability and easier to learn. I immediately decided to jump on the train and teach myself Angular 2 after hearing a youtuber say it did not make sense to learn Angular 1 since it wasn't going to be useful in the future. Easier to learn does not mean overnight or over a week but rather fewer weeks or months to come up with a relatively medium level application. If we couple this with the ten thousand hours rule which is close to three years taken learn to master a skill, we can agree that it’s traits such as passion that would maintain one’s desire to perfect their craft.
 
Moving on the idea of developers having long-term vision, it also helps developers in making short-term decisions. My interpretation is if you aim to be a Senior C++ developer for example, starting with learning to master how arrays and pointers work would be a great starting point for you. As we all know the wise saying, journey of a thousand miles starts with the first step, so this is that step. Day after day, a new framework is created for instance in the JavaScript world, having a long-term goal of what the craftsman wants to master, it’s easier to stick to a path that leads there with the most reasonable amount of time whether it's back-end or front-end. 
 
Just like the previous chapter, we are reminded again of the importance of seeking mentors to collaborate, guide and give feedback to the software developer. I’ve tried this and it never fails, many times an experienced developer will point you to look in a direction you didn't know was possible in achieving a task and it ends up working in your best interest.

Monday, February 6, 2023

Apprenticeship Patterns Blog 2

Chapter two of the book talks about “Emptying the cup” and what that means in a programming context is our willingness and readiness to put aside our prior knowledge and take in the new that’s being taught or learned. I found the story of the young philosopher meeting with the master zen interesting and of great value. In summary, the young philosopher couldn’t keep his mouth shut to listen to what the master zen was sharing because he believed that he had already been taught those concepts and there was therefore no need for repetition. In my opinion, this is totally wrong that because it eliminates the fact that there could potentially be a newer or better way to achieve something and there always is. One company that has been doing this for quite some time is Apple Inc. Each year during their Word Wide Developer Conference they introduce new concepts and tools in their programming platforms such as Swift programming language that replaced Objective-C for developing iOS applications.
 
Moving on to your first language, the author advises that one picks a langue, become fluent in it and hone as much skills as possible. They recommend this choice be weighed correctly as it’s upon this foundation that one’s early carrier will be built on. Build a toy project in this language where you can experiment with ideas. There is however a caution to this, and I will quote from the book, “One danger of digging deep into your first language is getting stuck”. It is crucial to consistently improve our skills by taking on smaller projects from different platforms that we may not be familiar with. I agree with this since there are known problems with some programming languages such as memory management above a certain quantity or performance issues that need to be addressed. However, for the most part, there is also work-around these types of events. I hope to use this pattern to learn as much as I can in the languages that I'm currently experimenting with.
 
Object oriented programming concepts are pretty much the same regardless of the platforms and this facilitates the learning of other languages for example if you’re comfortable programming in java, it is relevant to apply those skills in C++. Software craftsmen need to be dynamic in exploring diverse approaches to come up with solution.
 
The authors recommend developers to collaborate on projects with more experienced developers while also receiving feedback from peers. As the saying goes, “birds of the same feather, flock together”, it is imperative that the apprentice spend time working on small projects with senior developers to build their skillsets before moving onto bigger projects. The authors caution on overly depending on experts and rightly so, as this may slow the learning process.

Monday, January 30, 2023

Apprenticeship Patterns Blog 1

The Apprenticeship Patterns by Dave Hoover and Adewale Oshineye is such an interesting book and hopefully a must read for aspiring software engineers, designers, developers or even hobbyists. From computing ethics, I learned that scientists are morally responsible for ensuring that the technology created or software released is aimed at improving the quality of life of humanity rather than destroying it. Creating high quality software not only benefits the current users and developers but also future developers who might need to replace, maintain and build more features. The book teaches the importance of having a growth mindset that comes from dedication and hard work.
 
From chapter one, Dave’s self-taught struggles stood out to me. He wanted to learn Perl at age 12 and later Java at 25 and almost gave up until when he was 26 and found mentors Edventions LLC in Skokie, Illinois at the height of the dotcom bubble. I can relate to this as I’ve taught myself some programming languages through youtube videos. Programming Channels such as FreeCodeCamp.org provide multi-hour video content free of charge and teach high quality materials. It's easy to give up especially when motivation starts to fade out. I've been in similar situations when I learning flask, a light-weight web application development environment using Python.
 
Moving on, I’ll quote from the book, “If you come to me with a cup that is already full, how can you expect me to give you something to drink?” this was the Zen master’s reply to the young philosopher who couldn’t shut up during their conversation. The authors teach that we must be open to learning new programming languages to which I agree and not simply sticking to those we already know or simply thinking in the patterns that we’re comfortable with. Though this is a somewhat painful experience, it’s fulfilling to reach that point where you build something that you can show off because of hard work. When I look at current job descriptions for example, I see most requiring Java or C++ programming skills which means I must be ready and willing to take on the path described by that company as a software developer rather than me dictating what platforms I prefer to work with.
 
I’ll touch on the pattern of constructing your curriculum which emphasizes that concepts or programming languages should not only be learned at surface level but rather on a deeper level. This helps to save time such that the programmer is not reinventing the wheel or working towards an idea that has been deemed academically impossible and instead must refine the problem to make it soluble. Personally, I can relate to this when it comes down to JavaScript where I’ve learned some concepts and can come up with interesting solutions, but deep down I believe there’s always another leaner, faster method to produce the same or better results.

Sunday, January 22, 2023

Thea's Food Pantry and LibreFoodPantry

 It's such a great opportunity contributing to a meaningful project like Thea's Food Pantry, an open source program dedicated to Worcester State University students who might find themselves in need of food supplies. The program was established so that students can focus more on their learning rather than worrying about going without food. Food insecurity is a reality that affects a third of Massachusetts college students due to various factors such as hikes due to inflation and heavy financial burdens for instance paying student loans.
LibreFoodPanty is the opensource infrastructure on which Thea's Food Pantry operates. It's a template roadmap of principles that we'll be using to build and connect features on Thea's Food Pantry. Going through the docs, LibreFoodPantry (LFP) had an interesting user story map in picture format that shows different roles and responsibilities of users which I found to be interesting. Some of the roles include administration, staff, guest and donor. It's always a good thing to have visual like this before writing any line of code as it creates clarity of what needs to be done.
Thea's Food Pantry also has user stories but in a textual format that shows how the intended users of the software currently work and the guide to the design of the software. They have the same user roles as shown in LPF but detailed such as displaying a blank page when a new guest access the system.
Overall, the two systems are a solid foundation for practicing how to write opensource software products.

Friday, December 16, 2022

Implementation of web systems

This week's blog features content from Geeksforgeeks, a site that features 20000+ Programming Questions, 40,000+ Articles, and interview experiences of top companies such as Google, Amazon, Microsoft, Samsung, Facebook, Adobe, Flipkart, etc
 
Web systems are systems that use internet technologies to deliver information and services. Deliveries might include textual data, multimedia or any other format. There are various ways web systems can be packaged and delivered to users, for instance through websites, web apps and can be embedded into hardware as in internet of things frameworks.
 
For most users, their interaction with web systems is through websites. They are web pages that get served over the internet. A website can either be static or dynamic. Static websites simply deliver data and information and do not perform requests to a backend service. What you see is what you get. On the other hand, dynamic websites will change state based on the user’s interaction with it. Requests are sent to a backend service that returns data and changes the state of the site whereby a user gets to see a different view based on their interaction.
 
Web development can start by building the application from scratch or using a framework that provides a boilerplate (sample code) to start from. There component of web development includes web design, web publishing, web programming, and database management. Frameworks include, AngularJS, ReactJS, VueJS, Laravel etc. There are two sides to bringing a web system to life, the front-end development, and the backend development. Front-end also known as the client side is that part that the user directly interacts with. It could be buttons, lists, cards, or multimedia component. Front-end technologies include HTML, CSS, JavaScript, Bootstrap, JQuery and many more. The challenge associated with front end development is that the tools and techniques used to create the front end of a website change constantly and so the developer needs to constantly be aware of how the field is developing.
 
Backend development is that part of the web system that users cannot see. It receives requests, computes the request, stores (in some cases) and return the result to the front-end to display to the user. It includes writing APIS, creating libraries, and working with system components. Database services and algorithms for instance live on the backend side of a website. Technologies used include NodeJS, PHP, Ruby, Java, Python etc.
 
We’ve used some of these technologies in class and seen their effectiveness and structure. In Thea Food Pantry web system for instance, VueJS is used as well as HML and CSS.
Sources:
1. https://www.geeksforgeeks.org/web-development/
2. https://frontendmasters.com/guides/front-end-handbook/2018/what-is-a-FD.html

Friday, December 2, 2022

REpresentational State Transfer - REST APIS

 For this blog I chose For this blog I chose https://restfulapi.net blog for its well descriptions of terms about Representational State Transfer and how it works. REST was coined by Roy Fielding in 2000. It is an architecture style for designing loosely coupled applications over the network, that is often used in the development of web services.

 

An API (Application Programming Interface) is a set of definitions and protocols for building and integrating application software. It’s the glue between an information provider and information user or a gateway between clients and resources on the web. Clients are users who want to access information from the web, while resources are information that different applications such as backend services provide to their clients. It could be presented in different format such as multimedia, images, videos, text, numbers or any other data type.

 

When a user makes a request via rest api, it transfers a representation of the state of the resource to the requester. The representation comes in several formats via HTTP: JSON (JavaScript Object Notation), HTML, XML, XLT, Python or plain text. JSON is the most common format used due to its well readability by humans.

 

1Headers and parameters are also important in the HTTP methods of a Restful API HTTP request as they contain important identifier information to the request’s metadata, authorization, uniform resource identifier (URI), caching, cookies etc.

 

2A REST api requires requests to contain components such as Unique resource identifiers, methods, HTTP headers, data and parameters. Some methods include GET, POST, PUT, DELETE. 

GET is used by clients to access resources that are located at a specified URL (Uniform Resource Locator)

POST is used by clients to send data to the server.

PUT is used by clients to update existing resources on the server.

DELETE is used to request to remove resources from the server.

 

HTTP Headers display the http method request or response that passes additional context and metadata about the request or response.

 

Data

Information that is passed into POST, PUT and other HTTP methods

Parameters in a request include path to specify URL, details, information about the resource.

 

3Below are 6 architectural constraints which make any web service a truly restful api:

1.    Uniform interface : 

2.    Client-server : Client applications and server applications much st be able to evolve separately without any dependency on each other.

3.    Stateless : The server will not store anything about the latest HTTP request the client made.

4.    Cacheable : For performance improvement, data can be temporarily be stored on client side

5.    Layered system : Data can be stored on server A, authentication on server B and accessed via server A

6.    Code on demand : Data can be XML or JSON format or executable code to support part of the application

 

Sources

1.    https://aws.amazon.com/what-is/restful-api/ accessed on 12/2/2022

2.    https://aws.amazon.com/what-is/restful-api/ accessed on 12/2/2022

3.    https://restfulapi.net/rest-architectural-constraints/ accessed on 12/2/2022

 

Apprenticeship Pattern Blog 7

 This blog is an extension of chapter 6 of the apprenticeship patterns which talks about creating your own curriculum. The message is that t...