Introducing a PHP library for the Hashnode API

When I heard about the Hashnode Christmas Hackathon, I immediately began brainstorming ideas to develop something that members of the community might find useful, but would also be a great learning experience for me. After all, learning is at the heart of Hashnode.

In any case, after numerous scrapped ideas and half-baked prototypes (that I’ll talk about in an upcoming article!) I decided that I would go in the direction of building a library – something that I have never done before, and using PHP, a programming language that I’m quite familiar with. By working on this project, it was my ambition to learn more about GraphQL, the technology that Hashnode’s API (Application Programming Interface) utilises, and something I previously knew nothing about!

Enter, an unofficial PHP library for interacting with the Hashnode API in PHP.

How can I use it?

Visit the GitHub Repository

Update: The library is installable via Composer.

composer require oliverearl/php-hashnode

In your own code, you can instantiate a client instance and a root query object like this:

$client = new Hashnode();

$query = new RootQuery();

You can also specify a custom endpoint, or your Hashnode API token by adding it as a parameter to the Hashnode constructor:

$client = new Hashnode('https://some-other-endpoint.hashnode.com', [
  'Authorization' => 'token-goes-here'
]);

For more information on how to use the library, including how to retrieve data from the API, I strongly encourage you to view the repository’s README! I hope to write more in-depth documentation soon as it’s on the development roadmap!

You do need PHP 7.4 (or above) for the time being. Sorry about that!

Is it complete?

Almost. I really wanted to have it completely done before New Year’s Day, but truth be told I have had other responsibilities and familial commitments throughout the winter break that limited my free time. I hope you can understand!

However, all functionality to retrieve information from Hashnode is complete!

The development process

Originally, I wanted to develop something that was similar to how Laravel works with its models, where you could say $post->get(); and retrieve something, but this is currently out-of-my-depth and is something I’m hoping to be able to do in the future with more learning. I used a GraphQL client library for PHP and attempted to use the repository pattern to build ways of wrapping queries in method calls, but I realised that it would be impossible to build flexible GraphQL queries in the way that I wanted.

My gripes with GraphQL

One of the things I found most frustrating with GraphQL as part of its inherent design.

You only get what you request.

This wasn’t like what I was used to when working with RESTful APIs where I could retrieve everything that I wanted by accessing the appropriate endpoint. Instead, there was one endpoint, and I had to build the appropriate query. I was immensely frustrated at my lack of knowledge and knew I had to find another way.

I remember getting so angry that I accused GraphQL of being ‘rehashed SOAP with JSON’ and retiring to bed. After a good night’s sleep, I realised that I was just ignorant of what I didn’t fully understand – and that’s okay. So I got back to work on the project, but knew I needed a new approach.

Enter the GraphQL OQM library.

After a bit of research, I found the author of the GraphQL library had also developed another library for working with objects mapped to queries, or OQM (Object-Query Mapping). With this library, I was able to generate and map queries and arguments into classes of their own. Whilst this sounds straightforward, I spent a lot of time rewriting the code into PHP 7.4 typed code and organising things into a structure that was easy to work with for someone who is relatively new to object-oriented PHP.

Without discipline, agile methodologies can collapse

One of the most important things I learned while studying software engineering is that successful software projects require a careful balance of discipline and agility.

Without agility, you’re basically working to a methodology like Waterfall where the process is too rigid.

Without discipline, you’re just hacking code together and abandoning the process and any kind of planning. Mistakes and problems can then creep in.

I try to use Test-Driven Development (TDD) in all of my projects, where I will write tests and then get them to pass by implementing the required behaviour. By the time I went back to the drawing board and started again from scratch using the OQM library, I was writing and modifying code without testing it properly, so I had to go back and write tests afterwards. This is less than ideal, and I’m hoping to have more thorough test coverage and integration tests going forward. But since I was working solo, it wasn’t a fatal mistake to make.

What remains and how you can get involved

This project is something that I want to keep working on in the future! There is still some work to be done (a full list is available on the repository readme) and there are undoubtedly areas where the code can be improved, or maybe there are bugs.

If you want to get involved, some key areas that need implementing are:

  • Documentation! I haven’t had the time to write a great deal of documentation, but if you’re a keen writer, this would be a great place to help out.
  • Integration tests – while a (semi-complete) suite of unit tests exists, more elaborate tests that test against full queries need to be orchestrated.
  • Implementation of code that performs server-side mutation – in other words, we can currently retrieve data, but updating, deleting, and creating data is yet to be done!
  • Build some single-file examples of the API doing cool things and pull requesting them to join the examples directory!

What I learned

Despite me starting a new PHP software engineering job this January and having confidently worked with PHP and Laravel on a number of projects throughout my career I felt relatively out of my depth this time. I realised that it was okay to not know absolutely everything and that I shouldn’t get too frustrated when I can’t wrap my head around a concept the first time around. Something that I should probably know better by now.

I learned that although I was frustrated with GraphQL for not being able to just retrieve everything that I wanted, I did acknowledge that it’s incredibly efficient as it does just that. Returns what you want.

Conclusions

I hope you enjoyed my little write-up and I hope you enjoy playing with the Hashnode PHP library as much as I did developing it! Of course, it’s not perfect and I’m not the best programmer going, so if you can help me improve it, I would love your help and hope to see you on GitHub!

Thanks again to everyone at Hashnode and I hope that you have had a wonderful holiday season and a merry Christmas to those celebrating. Have a safe and fun New Year’s Eve and I’ll see you in 2021!

My strategy for learning a programming language quickly

When I first arrived at my new school, I was completely unaware of what programming language they were using to teach the students – it’s something that is prone to change over time and isn’t usually mentioned on a job spec. Many schools throughout the UK will use Python from start to finish in both a procedural and object-oriented fashion later down the line, whereas some schools are still using Visual Basic. I was alarmed to find out that the senior students use C# – a language I had very little knowledge of and experience using outside of playing with it in Unity. Or so I thought.

This article is all about how I was able to rapidly learn C# and begin adding it to my programming repertoire because I was suddenly in a position where I had to! This isn’t a situation that is unique to educators such as me; as a developer, a system architect, or whatever role you are currently in or aspire to be in, there could be times where you too are forced to rapidly learn a new language, framework, or technology in the face of new circumstances, such as a new client or acquisition, or maybe your boss was just feeling malevolent.

Tip 0) A reminder that the language acquisition overlap is huge

Chances are, what you know already in another programming language will transfer over to a new one that you’re attempting to learn. Core concepts such as variables, classes, functions, arrays, and so on are more often than not going to remain identifiable as you change technology, give or take semantic differences. This is just like how once you learn how to speak another language, you get more efficient at the language learning process.

Granted, some jumps are larger than others, like getting used to semicolons and braces when you’re from a Python background, or entire design patterns such as MVC (Model View Controller) when learning a new framework like Laravel or Rails. Chances are though, you already know more than you’re aware of!

One more thing, please don’t be afraid of admitting you don’t know something! If you’re familiar with Broadwell’s learning competence theory, this is one step closer to mastering something!

Tip 1) Learn by doing

I knew to start writing C# my best bet was to download Visual Studio and get started*, and that’s exactly what I did. I dedicated a few hours to installing the software and building basic programs and algorithms that I knew just so that I could come to understand the syntax and general workflow.

I played around with building console apps, using Winforms to build some basic desktop applications, and when I was ready I decided to start looking around at tutorials online and on YouTube to learn some more complicated functionality, such as accessing databases, accessing and writing to CSV (Comma Separated Value) files, and so on. I remember laughing to myself when I found the StringBuilder functionality was just like the implementation in Java.

You can do as much or as little of this as you want, but I truly believe this is the most effective way to learn it, more so than reading or watching alone.

I realise that this isn’t the only way to develop in C#, especially on macOS or Linux. But this is what we do in my workplace, so it’s how I opted to learn.

Tip 2) Find a good reference guide

(If you want to suggest something to add here, please let me know in the comments!)

I don’t recommend reading textbooks or references from start to finish as an effective guide for learning programming languages. But finding a good reference that you can look at for additional insight is a great way of learning. Here are a few of my favourites for the languages I use most, and they’re completely free (unless stated otherwise):

Multiple / General Purpose

  • Codecademy (JavaScript, C#, Java, etc.)
  • freeCodeCamp (Web Development)
  • The Odin Project (JavaScript, Ruby)
  • General MOOC websites like Coursera, edX, Udemy, and FutureLearn also fall under this category

JavaScript

C Sharp

PHP

Tip 3) Learn from others

Learning from one another is a tried and tested way of aiding you on your learning journey. You’d be surprised what you can learn by sitting down with someone for half an hour when you get stuck. For me, sitting down with my colleagues and having them run through some of the aspects I was unsure about was immensely helpful.

I realise that this isn’t everyone’s cup of tea, nor is it a luxury available to everyone. As a bonus, I recommend giving fellow developers tweeting about the technology you’re learning a follow on Twitter if you use it.

Tip 4) Remember that this is an ongoing process

Don’t be discouraged. Remember, learning is something that developers and other professionals (teachers included!) never stop doing and there will always be gaps in our knowledge. We can’t possibly be experts on absolutely everything, so remember that it’s only necessary to learn what you need – you can always learn more along the way and there’s absolutely no shame in that.

In my experience, smart people are those who recognise that there are things that they themselves do not know.

The smartest people aspire to go one step further and learn what they don’t yet know.

Conclusion

In all, it took me a few days to get comfortable with working in C# and to develop my confidence where I was able to pick apart my learners’ work and debug it comfortably. I realise that I am absolutely not an expert, nor do I claim to be. But I know enough to do my job effectively, to teach it to other beginners, and to start me down the path of continuous learning and improvement in my own skills.

I hope that you enjoyed this piece of writing and that you find it useful whenever you might find yourself needing to learn something in a hurry.