How I Passed
People have continuously asked me how I passed the extremely difficult Magento 2 Certified Professional Developer PLUS exam. I’ve also been asked quite frequently about how I passed the regular Magento 2 Cert Pro exam. That exam was also difficult, but in my opinion, it pales in comparison to the PLUS. Below I will detail my opinions and experiences in hopes that this will help you determine if you are ready to take the test. I also hope to leave you with some good study concepts. Please understand that there is not some quick, magical way to gain the knowledge needed to pass. If there was, it would cheapen the value of the certification.
For both versions of the M2 Certified Professional Developer exam, both the regular and the PLUS, there is no replacement for experience. Both of those tests were designed so that you wouldn’t be able to simply read and memorize answers from the devdocs. Yes, the devdocs are a fantastic starting point, but they are NOT enough! The questions on the tests propose real-life development scenarios that require specific answers to questions that could easily be considered as open-ended. These types of questions can be nearly impossible to answer if you have not done the same or similar in your professional life. This is not an effort to dissuade anybody from taking the test. However, I personally wouldn’t recommend taking it if you have anything less than 2-3 years of full-time development experience on Magento Commerce.
Experience, in my definition, is not just figuring out how to accomplish the task in front of you by any means necessary. Experience is not gained by taking the path of least resistance when trying to accomplish a task. The experience I am referring to is:
- Consulting the devdocs before and during EVERY task
- Consulting the core for examples of what you’re tasked with EVERY time
- Making your best effort to understand the what/where/when/why/how of the core codebase to understand the effects that your code will have
For me personally, being a Technical Architect at my full time job is, in fact, not a job at all. For me, it is an absolute pleasure and I truly mean that. This career of mine happened by accident, a happy accident. I’ll detail that “happy accident” in another blog post for anyone that’s interested.
In the context of this article, what I mean by drive is the willingness and intention to work as hard as necessary to earn the certification. I wanted this certification so bad I could taste it.
In fact, it reminds of my first full-time job as a Magento developer. I desperately needed a steady job and a higher paycheck to stay afloat. I was given an opportunity by a small Magento agency in NYC. Great pay, the people seemed nice, and the possibility of turning my “side gig” into a real career was exciting! It seemed too good to be true. It turned out that the offer was conditional upon getting M1 certified. WHAT? I didn’t even know that Magento certifications existed! At the time, there were no real devdocs, no central source of study material, and little guidance. I had always felt I was on my own and I had three days to go from 0 to certified or no job. I studied and practiced different things for 18 hours a day from that Thursday until the Sunday of the test. It felt like a miracle to pass because it was not easy to me at the time. I wanted it so bad that I didn’t let the unlikely circumstances stand in my way.
Even though there was nothing at stake if I were to pass or fail the M2 Certified Professional Developer PLUS test, I wanted it very much. For me, I wanted it as a validation of self-taught and community-taught skills that led me to my dream job. It was more symbolic this time around.
Yep. I FAILED before I passed. I work on some of the largest, most complex Magento implementations in the world. I lead teams of developers. I architect solutions. I live inside the dev docs. I always read core code. I build Magento extensions at night, every night. I should pass with no problem, right? Nope. I got a 60% but the required minimum is 62%. I studied a good bit before taking the test and I felt very confident leading up to it. Even with all that experience and studying, I still didn’t meet the bare minimum of passing.
Failure didn’t weigh me down. I didn’t blame anyone and I didn’t kick the family dog. Instead, I noticed that Swift Otter had released their M2 Cert Pro PLUS sample test. I paid for unlimited retakes for one month and proceeded with that test. I got a 44% and I think the predictor at the end told me I had a 9% chance of passing the real test. I tell you, that was a real kick in the bean bag. I managed to find the positive in it though and I think that was key to passing the test this time. That miserable, defeating score I got actually turned out to be exactly what I needed to pass! Read on.
Between failing the real test and failing the practice test, it was confirmed: I was not ready..…yet.
After I took and failed the real test, I immediately made some notes that turned out to be crucial to my success. I wrote down any areas or subjects which I was sure that I didn’t do well in. I didn’t do this for the purpose of finding or memorizing answers. This was the start of my personal study guide.
At the end of the Swift Otter practice test, I had been presented with all of the questions I got wrong. I was able to see the right answer and my answer. This became an extension of my study guide.
I then compiled everything into a text document. After that, I started thinking up my own questions, even deeper into each subject area. I jotted down all of the use cases and scenarios I could think of without going overboard. After that, I used my own CLI script to spin up an instance of Magento 2.2.7 on Docker that would become my practice stage. I created a module to hold all of my testing code. For the next 30 days, almost daily, I worked through every single note or question I made in the text document.
Finally, for the two days leading up to the test, I studied for 10 hours straight each day. I studied the dev docs for each subject, I spent some time in Max Chadwick’s blog, and I coded up some sort of sample for EVERY single subject of my self-compiled study guide. I then walked through many use cases for every sample I coded up. The test asks things as specific as what happens when an exception is thrown during X event.
Specific things I did to prepare
- Indexers. I created custom indexers, verified they worked, and studied the classes they extended or the interfaces they implemented. Stepped through just about every single line of code execution for indexers, both in “scheduled” mode and “update on save” mode. I needed to know where/how data changes were handled for each mode. I needed to know the purpose of the _temp tables, the _cl tables and everything else. Everything…
- Staging. I spent significant time studying the Staging functionality. I wanted to know how/why/where/when Magento determines which staging version of a given entity to use. I also wanted to know where each bit of staging data is stored and whether or not it gets indexed, and if so, when. I also made a point of studying how Staging rollbacks work, what tables are used for managing staging versions, and how campaigns work. I Xdebugged the hell out of staging.
- Elasticsearch. This is one of my least favorite subjects but the question pool I was presented with did include some Elasticsearch questions. I spent a great deal of time figuring out how to modify Elasticsearch’s default behavior such as matching patterns, search query construction, and relevancy. I also spent some time figuring out how to exclude common words from being considered in the search. Finally, I studied up and experimented with performance-enhancing changes that can be found in Elasticsearch’s own developer documentation.
- Message Queues. On Docker, I added a container with RabbitMQ and then began creating my own code to send and retrieve data from the MQ. I spent a bit of time studying and experimenting with the various XML files that are necessary for Magento to work with message queues. I learned about topics, exchanges, brokers, publishers, consumers, and everything in between. Message queues are an area where I do not have significant experience.
- Extension Attributes. I use these all the time, of course. BUT, I don’t generally remember every detail or possible use case because when I develop, I have core code and dev docs to refer to. Instead, I gave myself a refresher on the interfaces used and their naming conventions, the classes they must extend and interfaces they might need to implement. I created a variety of extension attributes on a variety of entities and I created extension attributes of all different types: string, int, bool, array, object, and so on.
- Payment Methods. I built out a fake payment method and paid special attention to the XML configurations for the payment methods. I spent a bit of time determining the class extensions and interface implementations needed and walked through the steps needed for custom error message responses. I also made sure that it was able to be used both on the frontend and in the admin panel. Lastly, I made sure I knew how to make the payment method work with the Magento vault.
Ok, I think at this point you probably get what I am trying to say. I tried to learn everything about everything! I won’t continue to elaborate on every subject. The point is that for any given subject, you should want to know what happens in every use case imaginable. You’ll want to know why and you’ll want to be familiar with everything it affects in the codebase.
Additional topics I studied extensively
- RMA functionality
- Customer attributes and customer forms
- Category attributes and category forms
- Product attributes and product forms
- ACL permissions
- Grid/listing customization
- UI Component implementation and customization
- Order, Invoice, Shipment, and CreditMemo archiving
- Admin Actions reporting and archiving
- Console commands
- CSRF, XSS, clickjacks and other security-related topics
- Catalog customization
- Price modification
- Quote total collection
- Split databases
- Image Uploader classes and form fields
- Cart Price Rule functionality
- Catalog Price Rule functionality
- Target Rule functionality
- Everything else!
As I bring this post to a close, I hope this answers your collective questions about how I passed. The test is tough. Even if you have extensive experience as I do, don’t assume that you know enough to pass without significant study and experimentation time. Many of the subjects on the test require answers that you would normally reference the devdocs or codebase for. However, you don’t have the luxury of those resources when taking the test.
Study hard, then study harder, and good luck!