Notes
Notes - notes.io |
With respect to the questions asked earlier,
1. How many years of experience do you have as a developer and with which languages/frameworks/etc.?
I have 3+ years of developer experience. I am a Full Stack Developer and a Module Owner.
In my current job, we use Java, Struts in the back-end. We have our own internal Frameworks based on Java and xml (somewhat like an ORM) which we use for rendering tabular data, and for performing DB operations. Our product supports 3 DB providers (Postgres, MySQL, and MSSQL), and I am equally comfortable in all three. I have however worked using DB2 and Oracle 10g too earlier.
For API development, we had earlier done a POC using JAX-RS. But, we had decided not to go with it. I am now using xml to maintaining a Request Mapper (similar to the way Swagger handles the API request). For API testing, we currently use Telerik Fiddler and Postman
In the front end, we use vanilla JS, jQuery, CSS, JSP, JSON and HTML. We have recently started working using Ember. I personally haven't worked on Ember yet. However, I have a fair enough idea of how it works, as I have to review the code (of my team members).
As our product requires agent server communication, I have used, and am familiar with iOS messaging frameworks (Property Lists [plist]), and JavaAPNs (which is used to send notification to iOS devices). For Android agent server communication, we use JSON, and similarly for Windows devices, we use SOAP. I had also worked in XML technologies during my final year of college, namely SOAP, REST, JAX-WS for my course completion project.
However, apart from my work experience, I have personally learnt a little bit of Node.js, Mongoose, Swagger, MongoDB, Express.js, ES6 Javascript, Angular.js and React.js for developing a shopping application, for a client. (non - monetary) -- This work is in progress.
I had also, worked as an Intern in Cognizant R&D during my final year, when I used JMF (Java Media Framework) for developing a Video testing tool. During the process, I had used a few image testing tools, namely, Selenium and Sikuli.
With respect to versioning systems, I have used Git and Hg.
2. Do you have any links to a portfolio, Github, StackOverflow or LinkedIn I can check out?
You can visit my personal website at http://anjsudh.me
My Github profile is available at http://github.com/anjsudh
I haven't checked in much in the last couple of years after college, however, as you will see in the upcoming weeks, there will be many check-ins hereafter, as I have made up my mind to learn more. I will be making multiple small projects as I learn new technologies, and will be open sourcing the shopping application, as soon as I start development.
As for my LinkedIn profile, you can check it at https://www.linkedin.com/in/anjsudh
3. What's your availability like right now? If you're employed and would need to give a notice, how long would that take? What timezone are you in and what time of day do you work?
I am currently working in Zoho. There is no notice period here. However, I will have to wind up my current task, if I am quitting, as it will be unethical to quit in the middle. Give it a week or two, but that's the most it should take.
I work in Indian Standard Timezone, usually work from 9am in the morning to 7-11 30 pm at night. It varies based on the current task priority.
And now for the more in-depth questions. Ready? Let's do this...
Debugging
How do you approach a tricky bug? Give an example from a recent project. Have any favorite tools or techniques for figuring things out when they go wrong?
(max 300 words. Where helpful, include a few screenshots or a short video).
I rely mostly on logs, especially the timestamps and thread ids in the logs. I tend to add logs for every event, so, if a customer comes with an issue, I usually check their activity during the time, and note it down separately. Based on their activity, I check the code, in the particular build version and walk through to find out if there are any possibilities of code breaks. In my experience most of them generally fall under:
-> incorrect checks in code, missed null pointer handling, edge cases
-> missed parameter passing
-> two object manipulating the same reference / synchronization issues
-> dead locks due to files/ network
-> transaction related problems.
If I have a live setup where the bug gets reproduced, I would prefer to use a Debugger
I will tell you about one issue that I figured out earlier. It was one of those crazy issues that barely got reproduced.
We usually sync Data form Active Directory after Active Directory addition or modification. However, somehow, one fine day the sync didn't work as expected.
On checking the logs, there was an exception as if domain was not even added, and that was why the sync had failed. But, when customer db was queried, entry was present, for the same row. Shocking right?
Now, let me tell you what had happened, I looked into the code and traced the steps.
My first instinct was to ofcourse not trust the customer, and check for his action logs, but, no he had not deleted the AD domain from the console,
There were no foreign key relations from this table to any other table. This was the base table. So, my best guess was data had not been added at that point, and must have been added later on in the workflow.
So, I checked the code. But according to it, the sync task was initiated right after the entry was added to DB
Something did not make sense here. I went up a few steps higher in the workflow, and noticed similar exceptions in some flows, but there were also logs where table's pk values were printed. Shocking!
But, all the flows that had this problem, were called from tasks, as separate threads. This is when I noticed, that they had used a transaction over the entire gist.. So, domain addition happens in a transaction, and in the same transaction, tasks are invoked)
These tasks are written by our framework team. According to their working, they fix every work done inside a task as a separate transaction. So, its like there are two transactions running parallely, and one cannot read the data inserted by the other, as it is not even commited. This was the problem. This issue was not consistently reproduced, as it all depended on the time the task starts running. If it starts after the transaction ends, there wont be any problems. However, on the other case, sync wouldn't happen.
Testing
Can you tell us about a project where you have written tests and whether they were successful or not in increasing the quality of the code?
If possible, show an example from a recent project (pseudo code or link to a gist/commit/file) of how you rewrote some code to make it more testable.
(max 300 words)
My product currently works based on device server communication. Hence, automated testing was earlier not possible. As one of my first tasks when I joined Zoho, I had developed a simulator, to simulate communication between the mobile device and server. Raw data that were posted from test devices were duplicated, and reused to be sent from a separate simulator. As agents always initiate communication with a server, upon providing the device count, and a server url, in the simulator, data will be posted to the server like it is from a device.
On a further note, I am currently working on developing REST APIs for product integration. As a part of the work, for every endpoint, I have used Postman to write a complete workflow for testing individual modules (TDD). Devices can be added to the server using the simulator, and after that the complete product can be tested using the test cases developed using Postman. These two can be integrated and initiated upon build creation.
Best Practices
Describe something that is considered a "best practice" for a technology you're familiar with, and what factors go into your decision of whether to follow it or not.
Then, walk us through a code sample from a recent project where you've had to make such a decision. Your code sample can be links to commits/gists/files, or just paste snippets here and walk us through your decisions.
(max 300 words)
As we work using Java, I personally prefer to write a code this way:
I usually try to look at the characters/objects involved in the problem or scenario, and write down what they can do )methods, and their properties (attributes)
I then try to identify the relation between them, and map them accordingly (is a relation for inheritance , has a for containerization)
For each functionality or method, I then write down the workflow in plain English, and translate them as private methods. After this point I can write the implementation for the private methods
I make it a practice to not write static methods much, as they create unnecessary overhead (they will be loaded into the memory). If there is a scenario were I need static methods, I usually write a Singleton Handler, that has methods that do the same job. (I do, however ensure that the handler has no instance variable of course)
For workflow, I make it a point to consider if they code may need to be reused later on. In such scenarios I try to write a code without any dependencies (table names/ module names etc) I try to pass these sort of data to the workflow during object construction. So the effort involved in developing the workflow need not be duplicated.
Let me give you an example of this kind of work I had done earlier,
Lets take the case of File Import. Say data imported can be in one of the formats : CSV/ XLS etc. As bulk data will be imported, we usually tend to write everything down to a DB first without any processing (500 records at a time), as the stream might break / close anytime. We then read data from the database, and process them based on the need. This workflow is common for all types of file uploads, so it will be fixed, and be methods of Base class. Implementation will differ for CSV upload and XLS, which can be handled by approriate FileReaders. The correct implementation can be chosen at runtime, based on the content type of the file
Now, if I wish to reuse this, for multiple scenarios, say sendBulkInvites(), or bulkAssignUsersToDevices(), the table where the data will be stored, the task that will process the stored data, header validations and row validations will differ. Ofcource row validation can be done by the task that processes the stored data. For the other three requirements, we can write an abstract class like this.
abstract class FileImport{
protected final Schema table;-- set by derived constructor
protected final String taskName; -- set by derived constructor
abstract void validateHeader() throws Exception;
public final importFile(FileReader f){ //workflow -- note am using a generic file reader here , note it is final, as it must not be overridden
persistFile(f);
initateProcessTask();
}
private persistFile(FileReader f){}
}
private initiateProcessTask(){}
}
Now an implementation class will set the table Schema in the constructor, and will write provide appropriate task that should be invoked post persistence, and privde proper validation of the Header
I am not if you understood everything. Let me know if we can have a call maybe, so that I can explain this more clearly
I am currently working on API development, and there are plenty of learnings there, which am open to discuss too..
I apologize for not being able to share any code, as there is a strict confidentiality agreement on company code. I am open to discussing at even lower level depths if that is necessary, for more clarity. Apologies for the inconvenience.
I am currently looking for a change, as I want to get out of my comfort zone and learn more technologies. This is currently not something that is available in my current work environment. Hence, the need for a change.
|
Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...
With notes.io;
- * You can take a note from anywhere and any device with internet connection.
- * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
- * You can quickly share your contents without website, blog and e-mail.
- * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
- * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.
Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.
Easy: Notes.io doesn’t require installation. Just write and share note!
Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )
Free: Notes.io works for 12 years and has been free since the day it was started.
You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;
Email: [email protected]
Twitter: http://twitter.com/notesio
Instagram: http://instagram.com/notes.io
Facebook: http://facebook.com/notesio
Regards;
Notes.io Team