Jun 08 2020

Techie rant

Category: TechnicalIuliana @ 21:17

Do not take this entry seriously. Or do it, I don’t really care right about now.

When I was a young highschool student I saw being a programmer as a very rewarding job, not only financially, but personally as well. I dreamed of all the problems that computers could solve and I wanted to contribute with my brainpower to writing those solutions. So I became a programmer, then I discovered it was cooler to call yourself a software developer, then I figured software engineer describes my expertise better, then software architect and finally I am being called these days a full-stack engineer.

Only I don’t feel like anythign anymore.

I haven’t written code that made use or improved an algorithm in years. So I can’t call myself a programmer anymore.

I haven’t designed or wrote an application from scratch either, and my toy apps that I sometimes write for my technical books do not really count. So I don’t feel like software developer describes me either.

Software engineer? Ha! I barely understand how IPs work most times.

Software architect – I doubt I’ve ever been one.

And I can’t call myself a full-stack engineer, because I should know a lot of things, but every day I feel like I know less than what I need to do my job.

And I hate it. I hate that after six years of studies and more years working in this domain I am reduced to scavanging Google pages and hoping somebody else had the same problem as me and there is a solution that might work for me, prefferably one that I understand.

I love writing code, really, I do. But I’ve been reduced to mixing and matching existing APIs, and hoping that the documentation explains well enough what I need to send to get the correct response.

In IT we used to have a separation of responsabilities. Developers designed and wrote code, sysadmins designed and managed the infrastructure and testers tested the application. It was pretty straightfoward and the sysamin did not care if the code threw a NullPointerException and the developer did not care if the application server could not reach the database. They all solved the problems specific to their piece of evironment. It was pretty niched and it was working fine, well most of the time.

But then Amazon had the wonderful idea of selling VMs. Which is all good and nice until you have an issue and you can’t fucking ssh into it. And some smart ass sysadmin figured out it could automate creation and destruction of VMS. And then some smart developer figured out if a sysadmin could write code to control VMS, so could he. So this is how the DevOps were born.

And then some developer unable to write code that would work on any machine thought: what if I could deliver the environment where my code works? And so Docker entered the picture. And every software developer thought it wasn’t cool to have your code run on your machine, it was cooler to have it in a container. Nevermind that your application only prints a shitty “Hello World!” that you could just write on piece of paper and shove it where the sun don’t shine …

Oh wait where was I? Oh yes, containers. They sound cool and they are… until you cannot fucking ssh into them to figure out what went wrong. And then you discover that the minimal OS of that container image does not support something you need, so there you go, you have to build your own image now.

And then some smart guy thought, what if I made an app that manages containers, and automatically scales them and kills them and then creates some more? This is how Kubernetes was born. And now we all design our applications to be as stateless as possible to allow for containers to be killed and reborn and keep the application online. And now we all use YAML as a fucking programming language. And we store a lot more data than needed in our databases, which are provided as a service, only making Bezos and others richer.

And because configuring how an application should be deployed ends up creating a lot of similar configurations, Helm entered the picture, as a repository for all possible kubernetes deployment configuration templates. It’s like Maven, but for Kubernetes configurations.

And because most applications are so complex they require multiple containers and connecting them is a pain, Istio appeared. And because that is exactly all we needed, more fucking YAML. Because who needs Amazon virtual private clouds and subnets, when you can declare your own for containers … using fucking YAML.

And I’ve just scratched the surface. There are so many technologies that I feel I no longer understand any of them. There are over 150 services running on Amazon AWS that are supposed to help people build applications. But for fuck sake, if I ever have a business idea that requires a web page where people should read about it, I’d rather build an application that runs on a single VM, with with data stored in an RDS Aurora instance and I would keep my business to a decent size to avoid needing all that shit. Why? Because it is a never ending story and it is a long painful trip down the rabbit hole.

Seriosly now, if you ever start a business and you think you need a web page for it, when your business grows it will get more and more expensive to maintain it. And if you hire some consultant company to put it in the cloud, it will feel a lot like this joke:

A young man from Minnesota moves to Florida and goes to a big “everything under one roof” department store looking for a job.

The Manager says, “Do you have any sales experience?”

The kid says “Yeah. I was a salesman back in Minnesota .”

Well, the boss liked the kid and gave him the job.

“You start tomorrow. I’ll come down after we close and see how you did.”

His first day on the job was rough, but he got through it. After the store was locked up, the boss came down.

“How many customers bought something from you today?”

The kid says “One”.

The boss says “Just One? Our sales people average 20 to 30 customers a day. How much was the sale for?”

The kid says “$101, 237.65”.

The boss says “$101,237.65? What the heck did you sell?”

The kid says, “First, I sold him a small fish hook. Then I sold him a medium fishhook. Then I sold him a larger fishhook. Then I sold him a new fishing rod. Then I asked him where he was going fishing and he said down the coast, so I told him he was going to need a boat, so we went down to the boat department and I sold him a twin engine Chris Craft. Then he said he didn’t think his Honda Civic would pull it, so I took him down to the automotive department and sold him that 4×4 Expedition.

” The boss said, “A guy came in here to buy a fish hook and you sold him a BOAT and a TRUCK?”

The kid said “No, the guy came in here to buy tampons for his wife, and I said, ‘Dude, your weekend’s shot, you should go fishing.’ “

After these weeks trying to make sense of why somebody would need all this shit, I totally understand the stay-at-home moms. Because keeping a house and raising kids is hard, but I bet it is more rewarding than this. Because a kid will smile at you and love you even when you are not perfect. But a Kubernetes pod will never fucking work if you messed up a small piece of your configuration.

I really hope one day I will come back to this entry and laugh at myself. But now I feel overwhelmed and bitter and I will stop writing so I can get drunk and cry with my cat in my arms and maybe tomorrow I’ll have enough will power to continue.

Stay safe, stay happy!


Mar 22 2020

Friends and readers, I need your help

Category: TechnicalIuliana @ 14:51

I never thought I would be writing this kind of entry, but here we are. My new book is getting thrashed on Amazon by 5 ratings under five, given by 5 people that could afford to spend more than 50$ on Amazon; because, this is the condition to be allowed to post a review on Amazon. Which makes sense, but it doesn’t mean it’s fair.

I’m not looking for a definite 5 rating for the book and I do not ask for praises that are undeserved. I just want people that actually read the book and found it useful to have a say in it. Which won’t happen on Amazon, unless the people will buy the book from Amazon. Which will make Amazon profit, but Apress and me won’t.

After reading those reviews, I thought that maybe I shoudl stop writing technical books. But then again, it’s just 5 people. And there are many others that liked the book and started shifting my thinking. Maybe the way I write isn’t for everyone, maybe I have trouble expressing some ideas; maybe some people just don’t like the way I write. It’s perfectly normal and expected. But, to trash a book just because you weren’t able to understand it, that’s unfair.

I have tried to read a lot of technical books that people recommended and I ended up just reading the chapter I needed for the topic I had an issue with. Technical books are not always easy to read. I know. But I never went online to trash a book or an author. Especially now, that I am a technical author myself and I know what it takes to write a book and the rewards you get. Which are mostly not financial. I’ve written about how much money I make from my four books before, here.

Also, people are more prone to voice their criticism than praise. I know, I’m Romanian, my people likes to complain, criticize and satirize a lot. I’ve worked for companies where I was doing my job and working extra hours, and I never received a pat on the back. But the first time I made a mistake, my head almost got snapped off. Figuratively, but you get my point.

Like I said, I do not want undeserved praise, but that rating and the comments are unfair. How do I know? Because I have a lot of messages by people adding me on LinkedIn because of my books. When I first started receiving messages from people buying my books I was shocked. I never even considered sending a message to an author, even if I loved their books. These people must have really benefitted from my books to make the effort. I am humbled by their messages and it was a slap in the face. Because I never took the time to say thank you to an author I liked, a mistake which I plan of correcting from now on.

And since we’ve talked so much about the LinkedIn messages, I’m gonna post a few screenshots. I haven’t asked these darlings for their permission so I’m gonna delete their names. But I’ll leave their titles as proof that some of them have enough technical expertise to be taken seriously. Some of the messages are about the previous edition of the book, but still. There are more in Romanian, but I really did not have the time to translate them all. And there are more I did not get to answer to. I asked some of them to help me with a review. Most of them tried and they were blocked by the Amazon rule of being a good spender. There are more, some of them are about my other books, but I’ve taken enough time to write this entry and I do have other things to do.

And then there is this young woman, a student, new to programming and I made sure she gets a copy of my book for free, because she needs it the most. I am almost sure she is not shopping on Amazon too much and she won’t be able to help with a review. But if my book helps her become a better developer and gain confidence in her skills, that is better than any book review.

I owe my own career to some technical authors like Adam Bien, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, all the authors on Baeldung.com, the guy behind mkyong.com (that sometimes post scode and configurations that do not really work, but he has the right idea and it just points me in the right direction) and all developers confident enough to answer technical questions on stackoverflow.com.  And I feel so proud knowing that for some people, I’ll be in the same list with these guys. I am grateful for each and every line of existing text, code or configuration produced by these guys that helped me become better! But they wouldn’t have been where they are if they would have been brought down by a few bad reviews. So I won’t either.

I would like to end this entry by saying thank you to all of you that have bought my books and that have provided feedback. And if you are kind enough to provide an Amazon review, to try to correct my score there please do so, otherwise just post your reviews on your blogs, write about it on Twitter, send a feedback to Apress, or just leave a comment on my Books page and hopefully Google indexing will take care of the rest.

Thank you again for your support and for the people dissapointed by my books, I am really, really sorry, but if  your negative reviews cause Apress to break up with me and I would stop writing, I’ll never get a chance to make it up to you. Oh well, it is what it is.

Stay safe, stay happy!

[Later edit:] One of the reviews on Amazon says that the book is horrible because the formatting is bad. I have to agree, I don’t like it very much either. I’ll have to check with Apress and see how that can be improved in the future.

Tags: , , ,


Jan 31 2020

When I start my day like this …

Category: TechnicalIuliana @ 11:43

… it just makes all the sleepless nights that went into that book worth it.

Thank you for your feeback, Peter!


Jan 23 2020

One misconception about Java’s Optional

Category: TechnicalIuliana @ 15:26

Yes, my dear readers, this is a technical post. It’s not going to rock your world, it’s not going to give you an insight into this language that you’ve never had before, it will just make you think twice before writing code. This being said, let’s dig in.

When java.util.Optional was introduced in JDK 8, Java developers rejoiced because they could finally avoid the most common and hated exception in the language the NullPointerException. Just between you and me, I think it’s  useful to be able to have nulls, but using them correctly does require a certain mastery of programming in Java.

Before reading my article, I would recomment reading this one first. In case you do not have the time to, here’s a summary.

java.util.Optional is awesome because:

  1. NullPointerException is prevented at runtime.
  2. Null value checking is not required in the application.
  3. Boilerplate code is not required.
  4. It’s easy to develop clean and neat APIs.

I would like to attract your attention to number three in that list: Boilerplate code is not required. I would have formulated it as Writing boilerplate code can be avoided. But, really … can we avoid writing boileplate code using Optional? It depends. Certainly not for the example in that entry.

Let’s start with the setup. We need an Employee class that has two fields: id and name, both String values.

// Employee.java
package com.ic.one;

public class Employee {
    private String name;
    private String id;

    //constructor, setters and getters
    // or just use Lombok, whatever floats your boat
}

We also need a main class, that should contain two methods, one returning an Employee, one returning an Optional that will be used in the code that will be written to check exactly how much boilerplate can be avoided.

//IfPresentOrElse.java 
package com.ic.one;

import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;

public class IfPresentOrElse {
    public static void main(String[] args) {
        // here we'can call our special methods, to make sure the code actually runs as expected
    }

    public static Employee findEmployee(String id) {
        return id.equals("1234") ? new Employee("Gigi Pedala","1234"): null;
    }

    public static Optional<Employee> findOptional(String id) {
        return id.equals("1234") ? Optional.of(new Employee("Gigi Pedala","1234")): Optional.empty();
    }
}

Now that we have our methods to retrieve an Employee, or an optional, let’s do some comparisons.
Up until JDK 8, you could write something like this:

//IfPresentOrElse.java 
...
    // JDK 8 without Optional, version one
    public static void jdk8SimpleVersionOne (){
        Employee employee =   findEmployee("1234");
        if( employee != null) {
            System.out.println("Employee name is " + employee.getName());
        }
    }
...

The previous code is the most simple thing you can do when querying for an Employee, if an instance is returned, you print its name. Starting with JDK 8, the same code can make use of the Optional type to avoid returning a null value.

//IfPresentOrElse.java 
...
    // JDK 8 with Optional, version one
    public static void jdk8SimpleWithOptionalVersionOne (){
        Optional<Employee> optional = findOptional("1234");
        optional.ifPresent(employee -> System.out.println("Employee name is " + employee.getName()));
    }
...

It is said on this big bubble called the Java development world, that Optional spares you the pain of doing a null check. Yes, it’s true. But in regards to avoiding boileplate code, allow me to be the devil’s advocate here. Replacing an if statement with an ifPresent call and a Lambda expression, it’s just replacing an old-style boilerplate code with new-style boileplate code. The new boileplate code, it does look prettyier and smarter though, right?

Anyway, let’s complicate the previous example, and introduce a message to be written when there is no Employee with id 1234 found, in other words, let’s see what can we do with an if-else statement.

//IfPresentOrElse.java 
...
    // JDK 8 without Optional, version one
    public static void jdk8ComplexVersionOne (){
        Employee employee =   findEmployee("1234");
        if( employee != null) {
            System.out.println("Employee name is " + employee.getName());
        } else {
            System.out.println("No employee with id 1234" );
        }
    }
...

What will Optional do for this scenario? Well, as it turns out …

//IfPresentOrElse.java 
...
    // JDK 8 with Optional, version one
    public static void jdk8ComplexWithOptionalVersionOne (){
        Optional<Employee> optional = findOptional("1234");
        if(optional.isPresent()) {
            System.out.println("Employee name is " + optional.get().getName());
        } else {
            System.out.println("No employee with id 1234" );
        }
    }
...

… not much. Boilerplate is still there, and the ifPresent function is no longer an option unless we want to write a monstrosity like this:

//IfPresentOrElse.java 
...
    // JDK 8 with Optional, monstrosity
    public static void jdk8ComplexWithOptionalMonstrosity (){
        Optional<Employee> optional = findOptional("1234");
        optional.ifPresent(employee -> System.out.println("Employee name is " + employee.getName()));
        if(optional.isEmpty()) {
            System.out.println("No employee with id 1234" );
        }
    }
...

Let’s try to simplify the no-Optional example even more, and try to have a single System.out.println call, by updating a local variale named message depending on the situation.(Employee found or not – that is the situation :D ). The code can be written like this:

//IfPresentOrElse.java 
...
    // JDK 8 without Optional, version two
    public static void jdk8ComplexVersionTwo (){
        Employee employee =   findEmployee("1234");
        String message = "No employee with id 1234";
        if( employee != null) {
            message = "Employee name is " + employee.getName();
        }
        System.out.println(message);
    }
...

Optional will not help much with this scenario either.

//IfPresentOrElse.java 
...
    // JDK 8 with Optional, version two
    public static void jdk8ComplexWithOptionalVersionTwo (){
        Optional<Employee> optional = findOptional("1234");
        String message = "No employee with id 1234";
        if(optional.isPresent()) {
            message = "Employee name is " + optional.get().getName();
        }
        System.out.println(message);
    }
...

So, what is there to do? The only thing that makes things a little bit better here is the JDK9 ifPresentOrElse method, added to the Optional class. This method is quite smart, because it allows us to define an action that does not involve the value of Optional, for cases where there isn’t one.

//IfPresentOrElse.java 
...
    // JDK 9 with Optional, version one
    public static void jdk9ComplexWithOptionalVersionOne (){
        Optional<Employee> optional = findOptional("1234");
        optional.ifPresentOrElse(
                (employee) -> System.out.println("Employee name is " + employee.getName()),
                () -> System.out.println("No employee with id 1234" )
        );
    }
...

It does look better, but news flash, the boiler plate just moved now to the horizontal. So, what if we really want to have a single System.out.println call? Well… things become even more convoluted, because variables used in Lambda expressions should be final or effectively final, so we need to use an atomic reference for our message. And this leads to the previous example being written like this:

//IfPresentOrElse.java 
...
    // JDK 9 with Optional, version two
    public static void jdk9ComplexWithOptionalVersionTwo (){
        Optional<Employee> optional = findOptional("1234");
        AtomicReference<String> message = null;
        optional.ifPresentOrElse(
                (employee) -> message.set("Employee name is " + employee.getName()),
                () -> message.set("No employee with id 1234" )
        );
        System.out.println(message.get());
    }
...

Damn, there is no way to get rid of this boileplate code, is it?

The truth is, in programming there will always be statements and constructions that will need to be used more than others. These are fundamental parts that make up a program, you cannot avoid using them. And there is a limit to how much they can be reduced in size that is specific to that language. It’s like your daily commute. Sure, there are multiple routes and you can walk, or cycle, or drive, or take the train, but depending your situation and your other plans for the day, there is a way to commute that is more suitable than the others. And in the end there is a limited list of ways to commute, and you will end up using them over and over again, until you quit your job and move to Ibiza.

All of the examples above can be compiled and run with JDK 9-14. And they all do the same thing. I won’t touch the subject of performance, because an investigation into which statement is quicker than the other is overkill for me. There is not a best way to do it. It’s just a matter of preference and keeping the code readable.

I’m not particularly fond of any of those, and I decide the way I write my code depending on the situation.

And since we talked about the limit of reducing boilerplate code that is specific to the language, do you want to see how the same things can be done in Kotlin?

It was a rethorical question, I know you do. :D

//IfPresentOrElse.kt 
...
package com.ic.one

data class  Employee(val name: String, val id: String)

fun main() {
    // 2
    println("Employee name is ${findEmployee("1234")?.name}")

    // 3
    val  employee = findEmployee("1234")
    employee?.let { println("Employee name is ${it.name}") }

    // 4
    println (if ( employee != null ) "Employee name is ${employee.name}" else "No employee with id 1234")
}

// 1
fun findEmployee(id: String): Employee? =  if (id == "1234") Employee("Gigi Pedala","1234") else null
...

So, what happens in there? Well… let me explain each numbered section in the previous code snippet:

  1. The findEmployee function returns an Employee instance or null. The compiler knows that because the return type of the function which is Employee?. That question mark is not a mistake, is how we specify in Kotlin that a function can return a null value.
  2. That function can be called by a println function (the equivalent of the Java’s System.out.println) and here’s the fun part: the question mark can be used to test the returned value. That is why the question mark is called the safe call operator in Kotlin. If it is null, the name property won’t be accessed, instead null is returned, which in the case of line 2, will cause the message Employee name is null to be printed in the console, if no employee with id “1234” exists.
  3. NullPointerException avoided, but the behaviour is not what we actually want. Because we do not want to print anything in case there is no Employee in this case. Well, that can be achieved by using the safe call operator and the let inline function. Combining these two results in a function being called only for values that are not null.
  4. This section has the same effect as a if-else statement with a different message being printed for each scenario.

Side note: Yes, Kotlin supports placeholders too. You have no idea how much I hate writing System.out.println(“Employee name is ” + employee.getName()) or System.out.println(“Employee name is “.concat(employee.getName())).

I hope this proves my point. Boilerplate cannot be avoided, but it can be reduced within the limits of the language. And Kotlin does allow for a better job to be done than Java. And it doesn’t require an Optional type for it.

I know this is not an advanced technical entry, I know it seems to be no other conclusion than: do it as you feel more comfortable doing it.

But, I know for sure  somebody will find this entry useful. You are welcome, my darlings!

Stay safe, stay happy!

Tags: , , ,


Nov 24 2019

The last review

Category: Funny,TechnicalIuliana @ 2:41

When writing a technical book there are a few steps involved. Sure, I’m writing the text, producing the images and the code. But after that… the reviews come.

The first one is the technical review, if I am lucky I get Manuel Jordan, that is very scrupulous and very technically savvy. And he misses nothing. He corrects typos, code, asks questions and proposes changes that increase the value of a book. I’ve had other reviewers and they were not even a quarter as good as he is. So I began asking Apress for him as a reviewer for any book I write.

After Manuel is done, and I modify the chapters accordingly the grammar/expression review comes in. This is supposed to be performed my very good English/American language speakers that sometimes also use software to replace certain expressions. Reviewing my books after they do their work is the part I loathe the most. Why? Well, because they are probably not technical persons and because that software sometimes does shitty things, that they fail to notice. Also the final review that I have to do has a very tight deadline, although I have a full time job. When it comes to this review, nobody seems to care.

Anyway, this year I decided to show you a few samples of how my last review goes. So, I receive a PDF that is full of notifications regarding what was changed and with paragraphs highlighted in red, when they seem to make no sense. Every team or person that makes these reviews have their little peculiarities. In one of the previous books somebody replaced all instances of which with that. In the book I just finished reviewing these guys did the opposite.  In the previous book, one of these persons modified all the tenses of the to be verb to present tense. As you can imagine, I was not happy about it and had to review a 700 page book in a few days and correct the damage.

Seriously, I now have the impression that the grammar review is done to force me to read my own book. Because this review does the following:

  • messes up technical definitions
  • messes up some of the images by resizing them in the weirdest ways
  • splits up big phrases that make sense into smaller phrases that make no sense
  • sometimes fucks up correct grammar
  • and although there is a team of people doing this, they still managed to miss typos
  • and they missed LaTex formatting elements too

Anyway, do you want read more about my own personal 4-day hell? Here we go:

  • Apparently somebody in the team doing the review does not like the etc shortcut. Because it was replaced every where with and so forth. It’s not problem really, but it kinda adds 3 words to the book instead of one. So if the purpose is to keep the book smaller, to be (ahem!) transportable, they’ve failed.

  • Every time I introduce a piece of code or configuration, I introduce it with: You can write code like this:, or The resulting code should look like this: , etc. They hate the like this expression too. Because they always replace it with like the following. This is not a biggie either, I guess in their heads sounds more official or something, and it does not affect the technical meaning so I accept it.

  • Because the publisher is from the US, they do not like it when I use the word behaviour, because they always change it to behavior.

  • Sometimes they change words they do not recognize… just because. Somebody changed iBatis to bates, yes, like Norman Bates from Psycho.

  • Sometimes they delete the first piece of a phrase just because it mentions something from the previous section of chapter. I usually do that to continue the idea or compare it to something that I am about to introduce. Or they decide to split big phrases in smaller ones. The big ones make sense. The smaller ones, not so much. And before correcting their stuff, sometimes trying to keep the split phrasing, I just have to vent writing comments like these:Of course I delete them before I send the final document and for the moment it helps to release the stress.

  • All phrases containing any forms of [is|are|can be] used to [create| make | build] were modified to: creates, makes, builds. This has lead to the technical meaning of some things being totally trumped up. Forget about grammar being affected, the technical meaning is the one I am concerned about.

    I also have a more easier to read example:

    Microservices are a specialization and implementation approach for service-oriented architectures (SOA). They are used to build flexible, independently deployable services.

    became

    Microservices are a specialization and implementation approach for service-oriented architectures (SOA). They build flexible, independently deployable services.

    Say what? Who does the building, the microservices? Really? How? Do they use bricks? In defence of this team, after each [is|are|can be] used to [create| make | build] I should have added [by X], where X can be the Spring Ioc Container, the developer, god… you know, the one performing the action. Because apparently when we say metal is used to make cars, it just does not make sense without mentioning who does the making.

    Also, I can’t understand the logic of these persons. If you have doubts just imagine the construction used in a daily, human phrase. Flour is used to make bread is not the same with Flour makes bread. The first makes sense. The second doesn’t.

  • Sometimes they take expressions like it is used, it is created, it is mentioned and just remove the  it is part. No idea why.

Yeah, so this was my life starting Tuesday until one hour ago when I sent the corrected PDF back to them. Finally it is over (theoretically). The book, Pivotal Certified Professional Core Spring 5 Developer Exam (I still do not know who came up with this name), is done and I can finally sleep. Maybe.

 

Stay safe, stay happy and stay in bed!


Oct 30 2019

How I became an AWS Certified Cloud Practitioner

Category: Funny,TechnicalIuliana @ 2:08

This will not be a technical post instructing you how to learn to pass the certification. Because I, myself I passed the exam by accident. Because I scheduled the exam by accident. But let’s go back ti the beginning.

A few years ago, 2014 or 2015, Rpx quit working for Microsoft and therefore he lost access to the VM this blog was hosted on. So, in order to keep it, I bought a Reserved Instance from Amazon and installed everything there. Why an instance in the Amazon cloud and hot a cheap special WordPress hosting service?

Because I wanted to get more comfortable with Amazon cloud. And because the only way I knew how to install & configure Apache, Mysql and WordPress, was … manually. And I liked doing it. I still like doing it, even if probably I’m not that good at it. But since moving my blog to Amazon cloud, I’ve survived two hacking attempts, me experimenting and mucking up file permissions that WordPress barely worked anymore and random MySQL failures.

When I was looking for a new job, I was not looking for a cloud engineer job. I was looking for anything that would allow me to finally make more money out of my Spring expertise. But oh well, sometimes people just click and so far I’m convinced I made the right choice.

Thus I am now starting to shift from Java/Spring expert towards … full-stack, or better said Jack-of all-trades, a title that was given to me at the beginning of my career and kinda limited my job selection at the time; because apparently it was more valuable to be an expert on a single domain, than juggling with everything. It’s quite ridiculous that after managing to finally stick to a niche for a ten years, my initial Jack-of all-trades skill might have gotten it me paid better if I would just have stuck to it. But oh well, it is what it is.

The company I currently work for is an Amazon partner, but AWS certifications expire, so after some people left the company and/or the certifications of those that stayed expired, the company found itself in danger of losing the partner status for not having enough certified AWS certified people employed. And so, the latest three people that were hired, had to become certified. I am one of those people.

So I’ve started preparing. And I panicked, because I realized I haven’t learned for an exam in … 12 years. And the information you need to accumulate to pass the certification is basically a detailed manual on how to use Amazon services wisely. And they provide a lot of services, for … well… anything. And it is not logical, it cannot be structured or organized in some programmatic way, it is not about designing or implementing anything, it’s more similar to the driving license theoretical exam. And I hate this kind of exam. My mind works very well with information that can be associated, connected to existing information that is not part of the foundation of my expertise; because the new information is connected and inferred from existing information. But the AWS training material … its very hard to associate with anything. So… I read and I wrote and watched the video training samples and still I had the impression that I am retaining … nothing.

After my much-smarter and more logical and structured colleague passed the exam, I just logged into the AWS account and checked to see when I could schedule my exam too. Well, I’m not sure what I did, or maybe my Firefox trolled me, but aside from an exam date four days away, the next one was three weeks away. And being already panicked that I am not retaining information I feared forgetting anything in three weeks. So I scheduled my exam on the 25th of October, at the time I had no other choice. And I did this on Monday the 21st of October. I spent the next three days reading, writing, listening to those video tutorials again and panicking. In a way, whatever the result, at least I would be able to take a break from reading Amazon propaganda. Because this is 90% of the training material.:))

And luckily, I passed.

After that, I talked to my college and told him why I scheduled the exam so rashly and he showed me on his computer the calendar with available dates and well … there were a lot more dates available than what I saw.

So yeah, I scheduled myself by mistake, quite rashly for the AWS Cloud Practitioner’s exam. I was definitely not completely prepared for it. But apparently it was enough. And now I can take a break from reading about how to use AWS services and actually solve some useful tasks.

Lesson learned: Some mistakes are worth making.

All is well with the world.

Stay safe, stay happy!


Apr 07 2019

Is Spring still relevant?

Category: TechnicalIuliana @ 13:39

This Friday I’ve had a debate at the company with a colleague of mine which is known to be a straight up genius about the topic in the title. Obviously, I was arguing that Spring is still relevant, and my colleagues was arguing that it is not. How did I end up in this position? Well, since I’ve written so many books about Spring, why not? I’ve written books about how it can be used, explained its under-the-hood internals to others, I could talk to others about it, right? Well, turns out… not really. I am really bad at debates with geniuses, that happened to study computer science. Because I’m an engineer, I’m practical, I get down in the dirt to make sense of things and fix them up. I build things from scratch, and although I do overthink and design things, my overall direction is practicality. And this is what being relevant is for me. Can it make my work easier, faster, stable and can in the end produce revenue? Then it is relevant. So yeah, for me being needed and being useful means being relevant.

For him, being relevant, means change, means driving the domains toward innovation.

And because, our definition of relevant was different, the debate was a cluster-fuck. Funny as hell, but a cluster-fuck nonetheless.

Here is my take on this.

Continue reading “Is Spring still relevant?”

Tags: ,