Developer Interview Questions
developer interview questions shared by candidates
Top Interview Questions
Software Engineer at Gemalto was asked...
how do you get an Elephant in the fridge? 30 Answerstake the Giraffe out first? Dumbo, you make a big fridge I don't know! But do you know how to tell if there's an elephant in your fridge? There's footprints in the the butter. How can you tell when there's TWO elephants in your fridge? You hear giggling inside. How can you tell when there's THREE elephants in your fridge? You can't close the door. You're welcome. Show more responses Open the fridge door, take the elephant then put it in the fridge, close the fridge door. Done Through the door. Chocolate elephant I'll hire trainer from the world best circus. Get a bigger or fridge or chop the elephant up Why do you want to put an elephant in a fridge in the first place? A trail of peanuts should do it. Don't use buns, the elephant might put on weight. Open the door and release the chain from around his leg. Depends on the size of the fridge! Show more responses Ask it nicely, but empty the fridge first. You'll want an American sized fridge though. The cheap ones that barely fit a pint of milk are no good for this. Open the fridge door and ask him to step in. What's the purpose of that? Keeping the elephant cool? LOL! I build a bigger fridge. First take everything else out of the fridge. Cut the elephant into pieces (provided it's already dead)! 1. By pieces!!! Omnomnom! Every day a new piece 2. A toy. 3. A note "an elephant". 4. A slide. 5. Big industrial fridge. 6. Wouldn't do that Show more responses if it was a picture of an Elephant on the packaging. If we are putting animals in the fridge, I can understand a Chicken for eggs, and a Cow for milk and a Pig for bacon, but what would I use an Elephant for? Shoot it. Chop it up. Take to rendering yard. Render to slurry. Collect slurry in roller tubs. Freeze dry slurry. Blend freeze dried slurry to fine powder. Scoop powder into foil bags. Heat seal. Load fridge. Why would you put an elephant in a fridge? They are used to hot climates and have little fur, I doubt they would enjoy it? Do you need to cool the elephant? A hose and water would be a much cheaper and effective way of cooling the elephant, fridges are for static items that don't generate their own heat, like a warm blooded animal, if you need to do a post mortem, I would do it there and then moving it would would likely change many factors including position of the organs etc due to the size and weight, do unless you were looking in say blood your results could be effected by the data, if it is blood it would be easier to take a sample, if you need the fridge and I mean really need it and at the size of the thing, build it, if you need only a section take only the section, it will probably fit in a fridge if necessary use an industrial one. or get a refrigerated lorry with a ramp, logs, ropes, lots of men and pull. IF ITS DEAD... Invent a shrink ray to scale down its size or create a paradox. If you're under a time limit then simply fill the room except the fridge with mice. lay fridge on back, remove all shelves. get elephant to place one foot in fridge and one in freezer, then balance on those two legs. jobs done! Mince it. One or more comments have been removed. |
Design an algorithm to find the first unique element in an array. 8 AnswersOne possibility that comes in mind: * Walk the array, create a hashmap (key is the value in array, value is the count of such values). * Walk the array again and check the count in the hash map, once you hit 1, you have the first unique value. This is O(n) both space and time. Are you sure that this is O(n), it is definitely O(n^2), you go over all items twice. dear utk O(2n) = O(n) != O(n^2)... Show more responses Its a hashmap. It never guarantees you the order in which you inserted the elements...!! @ankush: this is where LinkedHashMap comes into play. An easier one would be to sort the array and since they are asking for the first unique element return the first element that does not appear more than once in the newly sorted array. @ankush: That does not matter, you do not need to keep the order in the hash map. You go again through the original array, so you definitely find the first unique value. The hashmap is just for bookkeeping. @kabajiegara: No, that will not work, consider array "2 1" - if you sort, you'll have "1 2" and would thus return 1, which is the wrong answer because the first unique is 2. |
Graduate LIFT Programmer at IESA was asked...
I got to the third and final interview stage with the company for which I had to prepare a presentaion talking about myself, how I would fit into the company and what I know about them. Previously I had a successful skype interview and a face to face interview where I impressed and was told to keep doing what i'm doing. So at this final interview stage I had prepared a presentaion about the company and I conducted additional research (as any normal person would), only to be told after a brief chat with an executive before I was supposed to do my presentation, that they wouldn't be taking my application further. Bare in mind this is just before I was supposed to do my presentation that I had prepared and had rehearsed for a considerable amount of time. I'm not angry/annoyed that I didn't get on to the graduate programme, because if i'd have been given the opportunity and they didn't think i'd be suited to it then I would say 'ok fair enough', i'm fuming at the fact that they wouldn't even let me conduct my presentation that they ask all graduates to make as part of the interview process to get onto the LIFT programme. When he was telling me why I hadn't got any further he almost seemed to take pleasure in telling me he'd done the same to over half the other graduates at this stage and didn't allow them to present either. As a whole this tells me the company is completely unprofessional, that their interview process is ridiculously flawed and that the executive who gave me my final interview is a horrible little man who takes pleasure in other people's failure due to his own lack of knowledge around how an interview should work. 8 AnswersYou had a lucky escape my friend Best thing ever is you got out of working for this bunch of amateurs. I still have the scars..... Why is everyone who posts anonymous? Show more responses You have had a very lucky escape! I wouldn't go back if I didnt have a job and couldn't find work anywhere else! Just read the other reviews and the good ones are people that had been made to do them! I worked there and left as soon as I could. They aren't professional, they get pleasure from making people cry in those ridiculous glass boxes slap bang in the middle of the office. I wish I had read the reviews before I started to work there. Promise you the world and lie to your face. Awful place, it's run by a narcissist who employs management who are narcissistic This exact same thing happened to me, except mine was after I completed my psychometric tests, to be told that I passed them with flying colours... Then the following week a lady from Admin called me to say that I failed the interview stages (which you have to pass to be invited to psychometric testing) I argued this and she said there must be an error and that she will get back to me - to this day I have received no answers and I wasted so much money and time attending the face-to-face interviews. Really happy I dodged a bullet here! Fortunately you found out at the right time that this company is odious and the management are deeply flawed. Treat it as a learning curve and take heart that most companies don’t treat people in this way and do not let it affect your confidence. That was a terrible way to behave and not letting you present something they had asked you to prepare is appalling. You had a very lucky escape - I’ve just left and couldn’t be happier ! |
A rabbit wants to climb some stairs and it can do steps of 1 or 2. How many possible paths are there to follow ( e.g 1-1-1... or 2-2-2 ... or 2-1-2-1... etc) 6 Answersuse recursion 2^n possibility... F(n) = F(n-1)+F(n-2) Show more responses Summation(i=0,floor(n/2))[(n-i)C(i)]. I'm sure this can be further simplified though. Correction on the above: Summation(i=0,floor(n/2))[(n-i)P(i)]. Summation(i=0,floor(n/2))[(n-i)C(i)] is correct. I need to sleep. Sorry. |
Software Engineer at Google was asked...
Write a function that takes the ordinal number of a column in a spreadsheet and returns the label of that column: i.e. 1 -> A 2 -> B, 26 -> Z, 27->AA 7 Answers!!!! There can be some bugs not fully tested use at your own risk =)... import java.util.ArrayList; public class OrdinalToColumn { public static void main(String[] args) { // TODO Auto-generated method stub int valueToConvert = 64; System.out.println(ordinalToColumnConversion(valueToConvert)); } private static char[] ordinalToColumnConversion(int valueToConvert) { // TODO Auto-generated method stub ArrayList numbersReverse = new ArrayList(); int sizeOfArr; int curIndex, rollBackIndex; while(valueToConvert>0){ // base conversion numbersReverse.add(valueToConvert % 26); valueToConvert /= 26; } sizeOfArr = numbersReverse.size(); curIndex = rollBackIndex = 0; while(curIndex rollBackIndex){ // borrowing can lead some cascading operation we have to roll back until all digits are more than 0 int barrowNumber = numbersReverse.get(tempIndx); // barrow from previous barrowNumber--; numbersReverse.set(tempIndx, barrowNumber); tempIndx--; int nextNumber = numbersReverse.get(tempIndx); // add to the current one nextNumber += 26; numbersReverse.set(tempIndx, nextNumber); } } else { curIndex++; } } if(sizeOfArr > 0 && numbersReverse.get(sizeOfArr-1) == 0){ // remove the highest significant bit if it is 0 numbersReverse.remove(sizeOfArr-1); sizeOfArr--; } char [] returnNumbers = new char [sizeOfArr]; for(int i = sizeOfArr-1, n=0; i>=0; --i, ++n){ returnNumbers[n] = (char)(numbersReverse.get(i)+64); // converting to capital letter } return returnNumbers; } } Here my solution in Java: public class SpreadSheetLabel { private static char LABEL[] = new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; private static void printLabel(int n) { if (n = 26) { n /= 26; str.append(LABEL[(n-1) % LABEL.length]); } System.out.println(str.reverse()); } public static void main(String[] args) { for(int i = 1; i <= 2600; i++) { printLabel(i); } } } I haven't tried interwee's solution, but that code is so complex and long for such a simple problem I don't even wish to try and understand it :) Anyways, here is my simple and elegant solution in Java: // Precondition: i >=1 public static String excelNumbering(int i){ if(i >=1 && i<= 26) return ""+(char)(i+64); else return excelNumbering((i-1)/26) + excelNumbering((i-1)%26+1); } Show more responses In C++: string excelNumber(int i) { string excelStr = ""; int numAs = i / 26; int rest = i % 26; for (int j = 0; j < numAs; ++j) { excelStr += "A"; } return excelStr + (char) (rest + 64); } Not sure what is meant to happen for error cases (e.g. 0). void calc_ord(int ord, char* out) { if (ord == 0) return; int tmp = ord; char *ptr = out; while (tmp <= 26) { *ptr++ = 'A'; tmp -= 26; } *ptr++ = 'A' + tmp; } public String getName(int n) { String ret=""; while(n>0) { char c='A'+(n%26); ret=c+ret; n/=26; } return ret; } here in OBJC. Is interesting that no one in the previous answers, is calculating the base system..everyone is hardcoding 26. - (NSString *)lettersFromOrdinal:(NSUInteger)ordinal { NSMutableString *letters = [NSMutableString new]; NSUInteger base = 'Z'-'A'+1; NSUInteger labelLength = ceil(customLog(base, ordinal)); for (NSInteger i = labelLength-1; i >= 0; i--) { NSUInteger pow_ = pow(base, i); NSUInteger res = ordinal/pow_; char letter = 'A' + res - 1; [letters appendFormat:@"%c", letter]; ordinal -= res*pow_; } return [letters copy]; } |
Java Developer at IHS Markit was asked...
How would you measure 4 litres of water if you have 3 litre and 5 litre canisters? 7 Answers1) Pour water in 5 litre container 2) Pour 5 litre container into 3 litre until full. You are left with 2 litre in 5 litre container 3) Empty 3 liter container. Pour 2 litre into 3 litre container 4) Fill 5 litre container until full 5) Pour 1 litre into 3 litre container until full. Left with 4 litres in 5 litre container. 1. fill half of the 3 litre container 2. fill half of the 5 litre container http://brainteaserbible.com/interview-brainteaser-puzzle-water-jug Show more responses bit lenghty but 1)both 3 & 5l are empty. 2) fill 3l, pour in 5l, fill 3l again and pour in 5l, you'll have 1 l in 3 l. now pour this 1l somewhere then fill 3l one more time. Add 2 full measures using the 5l, remove 2 full measures with the 3l, you are left with 4l. Fill full water in the 5 litre canister, remove 3 liters of it to the 5 litre to the 3 litre canister. Keep remaining in the 5 litre canister(=2 litre) somwhere. Take another 5 litre water and perform the same procedure.= another 2 litre... 2+2 =4 litre.. done. Fill full water in the 5 litre canister, remove 3 liters of it to the 5 litre to the 3 litre canister. Keep remaining in the 5 litre canister(=2 litre) somwhere. Take another 5 litre water and perform the same procedure.= another 2 litre... 2+2 =4 litre.. done. |
Software Engineer at Accenture was asked...
You have three doors, behind one there is a prize. You choose door A, after that I ll tell you that behind door B there is no prize, do yuo keep your choice or change it ? 7 AnswersChange it. The probability for door A is 1/3, the probability for the set Door C + Door B is 2/3. The interview adds information on the set stating that Door B prob is 0, so the probability for Door C is 2/3 while Door A stays at 1/3 Balls. Once you know that there is no prize behind door B, prob(B) becomes 0. Then, since the prize must be behind A or C, and you don't know anything about them, prob(A) = prob(C) = 1/2. Any of the doors is OK. Sorry Filippo (F?) but u r wrong on this one. U may see also it in this way: in the game You ll never be told that your initial choice is wrong, the information added is only about the other two doors. This breaks the symmetry, the probability that your initial choice stays at 1/3 ( It is secluded by the bit of more information added ) , but now the prob of b goes to zero and because all the probabilities must add up to 1, the prob(c) becomes 2/3. I understand it is not intuitive, but not all the math is :) Show more responses Sorry guys. none of the above is correct. You forgot the check on the sentence, as Interviewer may be lying or not (50% probability for each of the two). If he is NOT lying than there is NO price behind B --> you have 50% it is behind A and 50% it is behind C. If he IS lying than price is behind door B (100% sure) If you draw the brances tree and put it all together, you have that: Probab. = 0,5*[(0.5*A+0.5*C] + 0.5*1*B Ossia: Probab = 0,25*A + 0.25*C + 0.5B which means that both A and C have 25% probabiity of having it right, while B has 50% to be right. Therefore answer is: "you leave door A and choose door B ". Not because this IS behind door B, but because you have a higher probability this is there. :-) my vote is with Rob. this is covered in every basic probability and statistics course. I think Andrea is bringing unneeded complexity to the question Filippo's answer would be correct if he did actually open the door when he chose door A, but because it doesn't say that. So assuming that he telling the truth and that door B does not have a prize i.e probability of a zero, door C must have a probability of 2/3 . Therefore Rob's answer is correct. One or more comments have been removed. |
Merging of Sets: Sets Users which reference other user groups. 6 AnswersRecursively Hello! When did you interview? Beginning of November Show more responses Okay. Thanks! Hi, can you provide more details about the question? Thanks! Recursively is bad due performance ;-) Iterative is the better way. |
A task in which I was required to print all numbers between 1 and a million - with no repeating digits - Easy enough! Just can throw you off guard a bit 7 Answerspublic static void noRepeat(int n) { int[] ar; for(int i=1;i1) { flag = 1; } temp = temp/10; } if(flag==0) { System.out.println(i); } } } Your answer is correct, but it is slow. Here you are an algorithm that does same thinkg as you do, but also one more algorithm - using permutations. Instead of outputting to System.out I simply calculate how many numbers are there. Run and see how slow is your method for n = 8 (where n is the number of digits). import java.io.*; import java.util.*; public class NumbersNoRepeatDigits{ public class StopWatch { private long startTime = 0; private long stopTime = 0; private boolean running = false; public void start() { this.startTime = System.currentTimeMillis(); this.running = true; } public void stop() { this.stopTime = System.currentTimeMillis(); this.running = false; } //elaspsed time in milliseconds public long getElapsedTime() { long elapsed; if (running) { elapsed = (System.currentTimeMillis() - startTime); } else { elapsed = (stopTime - startTime); } return elapsed; } //elaspsed time in seconds public long getElapsedTimeSecs() { long elapsed; if (running) { elapsed = ((System.currentTimeMillis() - startTime) / 1000); } else { elapsed = ((stopTime - startTime) / 1000); } return elapsed; } } // mode complicated solution public static void permuteArray(int[] a){ permuteArrayCore(a, a.length - 1); } public static void permuteArrayCore(int[] a, int i){ if (i == -1) { if (a[0] > 0) printArray(a); return; } permuteArrayCore(a, i-1); // when ith element is on place; for (int j=i-1; j>=0; j--) { //swap i and j swap(a, i, j); permuteArrayCore(a, i-1); swap(a, i, j); } } private static void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } public static void selectMAmong10(int m) { boolean[] take = new boolean[10]; selectMAmongNCore(m, 0, take, 0); } public static void selectMAmongNCore(int m, int next, boolean[] take, int countTaken) { if (countTaken == m){ int[] x = new int[m]; int xi = 0; for (int i = 0; i = m - countTaken) selectMAmongNCore(m, next + 1, take, countTaken); } // simpliest solution public static boolean checkDistinct(int i) { boolean[] digits = new boolean[10]; while (i > 0) { int rem = i % 10; if (digits[rem]) return false; digits[rem] = true; i = i / 10; } return true; } public static int totalCount = 0; public static void printArray(int[] a){ totalCount++; /* for (int i = 0; i < a.length; ++i) System.out.format("%d ", a[i]); System.out.println(); */ } public static void main(String[] args){ int n = 8; NumbersNoRepeatDigits t = new NumbersNoRepeatDigits(); NumbersNoRepeatDigits.StopWatch st = t.new StopWatch(); st.start(); for (int i = 1; i <= n; ++i) selectMAmong10(i); System.out.println(totalCount); System.out.println(st.getElapsedTime()); totalCount = 0; System.out.println("-----------"); int max = (int)Math.pow(10, n); for (int i = 1; i < max ; ++i) { if (checkDistinct(i)) // System.out.println(i); printArray(null); } System.out.println(totalCount); st.stop(); System.out.println(st.getElapsedTime()); } } looks really simple (if I understood it right). Here is the SHORT java version. static boolean hasDupDigit(int i){ boolean[] digits = new boolean[10]; while(i!=0){ int r = i%10; if(digits[r])return true; digits[r] = true; i/=10; } return false; } static void printNums(){ for (int i=1;i<=1000000;i++) if(!hasDupDigit(i)) System.out.println(i); } Show more responses public static void main(String[] args) { for(int i=1;i<1000000;i++){ if(!hasDup(i)) System.out.println(i); } } private static boolean hasDup(int i) { String num=Integer.toString(i); boolean ret=false; char[] carr=num.toCharArray(); for(int k=0;k Permutations anyone? #include using namespace std; bool used[10]; // init to false int count = 0; int num = 1; void backtrack (int pos) { if (pos == 6) { count++; cout << num << endl; } else { for (int i = 0; i <= 9; ++i) { if (not used[i]) { used[i] = true; num = num*10+i; backtrack(pos+1); num /= 10; used[i] = false; } } } } int main () { backtrack (0); } Very Concise Python Solution.!!! def recur(start,nums): if start*10>=1000000: return for i in nums: val=(start*10)+i print val recur(val,nums[0:i]+nums[i+1:]) nums=[0,1,2,3,4,5,6,7,8,9] recur(0,nums) One or more comments have been removed. |
Software Engineer at Google was asked...
Given the pre-order and in-order traversing result of a binary tree, write a function to rebuild the tree. 5 AnswersHere is the algorithm (I am too lazy to write the whole program). Let's number the nodes of in-order traversing sequentially (1,2,3, etc.). Then take the list of nodes of pre-order traversing. The first one is the root. While their numbers (from in-order list) decreasing, connect them as left-hand children, one by one. If the next number is greater, find the node with the max number (less than this one) and connect this one to it as right-hand child. Etc. I think they meant any "binary tree" not a binary search tree; but ALL values must be different (imagine a tree with n 1's; it has a Catalan(n) configurations and the same pre- and in-order traversals). So here is a solution: node* rec(const std::vector& PRE, const std::vector& IN) { node * r = new node(0,PRE[0]); // root node * v = r; // what we want to return bool l = PRE[0] != IN[0]; // do I go left? std::set path; // ancestors path.insert(PRE[0]); for(int p=1, i=l ? 0 : 1; p!=(int)PRE.size(); ++p) { node * n = new node(r,PRE[p]); r = l ? r->_left = n : r->_right = n; l = true; // revert to left if (PRE[p] == IN[i]) { // must go right or up ++i; while(i _v); r = r->_up; if (r->_v == IN[i]) { ++i; break; } } } } } path.insert(PRE[p]); } return v; } The idea is that the pre-order is basically a depth-first search order, which is convenient to build the tree (it is always connected at every interim stage). The in-order is used to decide whether to move right or up. BTW, you can guess the definition of "node". I have done something in Java. Maybe this might help: import java.util.Arrays; import java.util.TreeMap; import javax.management.RuntimeErrorException; public class BinaryTrees { public static class Node { Node right; Node left; char value; // preorder // public String toString() { // return (value + " ") + (this.left == null ? "" : this.left) // + (this.right == null ? "" : this.right); // // } // in order // public String toString() { // return (this.left == null ? "" : this.left) +(value + " ") + // (this.right == null ? "" : this.right); // // } // post order public String toString() { return (this.left == null ? "" : this.left) + "" + (this.right == null ? "" : this.right) + (value + " "); } } private static final char[] preOrderStr = new char[] { 'u','f','A','C','M','h','s','9','6' }; private static final char[] inOrderStr = new char[] { 'A','f','C','u','s','h','M','9','6' }; public static void main(String... args) { BinaryTrees trees = new BinaryTrees(); Node root = trees.rebuildTree(inOrderStr, preOrderStr); System.out.println(root); } public Node rebuildTree(char[] inOrderS, char[] preOrderS) { Node root = new Node(); root.value = preOrderS[0]; int index = getIndex(inOrderS, root.value); char[] leftInOrderS = new char[index]; char[] rightInOrderS = new char[inOrderS.length - index - 1]; char[] leftPreOrderS = new char[index]; char[] rightPreOrderS = new char[preOrderS.length - index - 1]; System.arraycopy(inOrderS, 0, leftInOrderS, 0, index); System.arraycopy(inOrderS, index + 1, rightInOrderS, 0, inOrderS.length - index - 1); System.arraycopy(preOrderS, 1, leftPreOrderS, 0, index); System.arraycopy(preOrderS, index+1, rightPreOrderS, 0, preOrderS.length - index -1); if (leftInOrderS.length != 0 && leftPreOrderS.length != 0) root.left = rebuildTree(leftInOrderS, leftPreOrderS); if (rightInOrderS.length != 0 && rightPreOrderS.length != 0) root.right = rebuildTree(rightInOrderS, rightPreOrderS); return root; } public int getIndex(char[] chars, char ch) { for (int i = 0; i < chars.length; i++) if (ch == chars[i]) return i; throw new RuntimeException("No char " + ch + " in the vector"); } } Show more responses package datastructures.trees; public class BuildTreeInorderPreorder { public static void buildTree(int[] inorder, int[] preorder) { TreeNode root = createNode(preorder,inorder,0,preorder.length-1,0,inorder.length - 1); printPostOrder(root); } private static TreeNode createNode(int[] preorder, int[] inorder, int ps, int pe, int is, int ie) { if(ps > pe || is > ie) { return null; } TreeNode newNode = new TreeNode(preorder[ps]); int i; for(i = is; i <= ie; i++) { if(preorder[ps] == inorder[i]) { break; } } newNode.left = createNode(preorder, inorder, ps + 1, ps + i - is, is, i - 1); newNode.right = createNode(preorder, inorder, ps + i - is + 1, pe, i + 1, ie); return newNode; } private static void printPostOrder(TreeNode node) { if(node == null) { return; } printPostOrder(node.left); printPostOrder(node.right); System.out.print(node.x + ""); } public static void main(String[] args) { int[] preorder = {1,2,4,7,8,5,3,6,9,10,11,12}; int[] inorder = {7,4,8,2,5,1,3,9,6,10,12,11}; buildTree(inorder,preorder); } } class TreeNode { int x; TreeNode left, right; public TreeNode(int x) { this.x = x; } } Here is a compact solution using recursion. Assume your pre-ordering is given in "pre", and in-ordering is given in "in", in the form of integers from 1 to n, representing nodes. "p" is an indicator showing which of the pre-order nodes we're currently procesing, and "ind" is used to quickly find where a node is in "in". class Node { int value=-1; Node left=null, right=null; public Node(int val){value=val;} public Node(int val, Node l, Node r){value=val;left=l;right=r;} } public class Rebuild { int[] pre, in,ind; int p=-1; public Node reconstruct(int st, int ed) { p++; //go to next root if(st==ed)return new Node(pre[p]); Node lr=reconstruct(st,ind[p]-1); Node rr=reconstruct(ind[p]+1,ed); return new Node(pre[p],lr,rr); } public static void main(String[] args) { //input "pre" and "in" however you want, initialise ind for(int i=0;i |
See Interview Questions for Similar Jobs
- Software Developer
- Senior Software Engineer
- Intern
- Technology Analyst
- Software Development Engineer
- Graduate Software Engineer
- Java Developer
- Analyst
- Senior Software Developer
- Associate Software Engineer
- Consultant
- Graduate Software Developer
- Business Analyst
- Associate
- Financial Software Developer
- Software Engineer III
- Developer
- Product Manager
- Project Manager