IT giants: IBM, Google and Microsoft

This year was a remarkably great one and I'd like to mention why I think so.

IBM logoOn January 14th I received an e-mail from IBM that stated that my resume had been chosen and that they were inviting me to participate in the first stage of the recruiting process in Rio de Janeiro. The first stage was composed of a logical reasoning test, an English test and a composition. The estimated duration of the stage was about 2.5 hours. OK, I went there on January 19th at 3:00 P.M. and I did all the tests. On January 23rd I received an e-mail confirming that I had been approved in the first stage (tests) of the IBM passport (as they call the whole process). They stated that they’d schedule the second stage (group dynamics) as soon as possible. I received other e-mail on the same day and I was greeted with the following phrase: “You’ve been approved in the first stage and we’d like to invite you to the second stage (group dynamics) of the IBM recruiting process.” Again I went to the same place Botafogo, Rio de Janeiro on January 24th at 9:00 A.M. to take part in the second phase. In a timespan of just two days I received a message stating the following: “We thank you for your participation in the second stage (group dynamics) of the IBM passport internship program and we inform that your profile doesn’t fit in any of the open opportunities we have at the moment. We emphasize that this result doesn’t eliminate the possibility of a new entry in the next IBM internship program after a period of 12 months from this participation. Respectfully, IBM Brazil (Recruiting and Selection).”

From the above experience I have good memories. In the first stage I went to Rio de Janeiro with my dad. That was a great trip and an unforgettable one. My dad sad at the time: I think you’re going to succeed in it. But it wasn’t the time yet. I remember of a moment in which I was in the hall of IBM’s building right before the first stage and for sure I knew that was just the beginning of a great journey. At that time I was heading to the last two terms of the computer engineering course. This year I had to develop the final project too.

By the end of the year I realized it was time to start searching for a place to work. So I created a LinkedIn account and sent my resume to some places.

Google logo One of the messages was sent to a contact I got at LinkedIn site on December 13th. The message title was Job Opportunity and the recipient was Kerry Xin, a software engineering recruiter that works for Google. He replied my email asking me what's my phone number and confirming that he would call me. I then replied the e-mail writing: "There is only a problem: here in Brazil not everyone has access to broadband internet. So, I still use a dial-up internet connection. This way, my phone will be occupied while I'm on the internet. If you can, set a time for us to get connected on the phone." He then replied with the following: "I would like to call you at 8pm Brazil time, which is in half an hour. Is that ok?" Of course it was OK. I was going to talk with someone from Google. That was above my expectations. I just replied that message stating that he could call me at 8:00 PM. And so I talked to him on the phone. That was my first English phone call. We talked for about 15 minutes. The talk was about the available locations to work at Google and the specific area to direct three technical questions. I answered the first two questions but wasn't sure about the last one. In a later e-mail I sent him my resume and wrote that I can read and write almost everything in English, but to talk is still really strange (I'm not in the right environment). I need an opportunity to practice. I know I can master the English language if I'm in the right place. After a week I received a message from Kerry with the result of the preliminary phone interview. The hiring committee's feedback for the Google/SRE position wasn't positive. He thanked me for my time and interest in Google. According to them my background and experience was carefully reviewed and unfortunately they couldn't find a position that is a strong match with my qualifications at the time. He then affirmed that he would keep my resume active in their system and try to match my profile with new opportunities and would reach out to me if they find an opening for which I may be qualified. I then replied the "Thank you from Google" e-mail with the following: "Thank you for considering me. It was a pleasure to talk to you on the phone (my first English phone call). For sure I'll remain enthusiastic about Google. It's a splendid company! I use Google's services everyday and it plays a great role in my life." I think it was a good FIRST experience with Google.

More to come...

iPod nano 3rd gen. connection to the computer

I've just bought an iPod nano 3rd generation (4 GB) model. It arrived from Germany from a trip a cousin took there for his new job at Thyssenkrupp.

I decided to ask him to buy an iPod there because the price here in Brazil is an absurd. While in the USA it costs $ 149.00 and in Germany € 149.00, here in Brazil it costs an average of R$ 600.00.

I put my hands on the iPod on Saturday 12/22 in the afternoon although it were on my computer desk since the morning.

Firstly I tried to connect it in one of the USB ports I have on my computer. It didn't work. The computer refused to install the iPod and didn't recognize it at all. I kept trying any possible configuration but even after formatting the hard disk I couldn't get it functioning.

I googled for the causes of this problem and I found a lot of advices and possible solutions. For what I could see there are a lot of people with the same problem.

I spent more than 24 hours of constant research to get to a solution. It wasn't that obvious.

My motherboard is an ASUS A7S8X-MX and it has 4 USB 2.0 ports on the back. The USB controllers are from SiS, more specifically model SiS 7001 PCI to USB Open Host Controller (look at the expanded node in the image bellow).

When I tried to connect the iPod to the computer I got an error message that stated that the device had malfunctioned. Sometimes the operating system tried to install the drivers but failed during the process and stated that the device could not work properly. In truth it didn’t work. I couldn't see the iPod neither in Windows Explorer nor in iTunes. So what was the solution? I got the motherboard manual and searched for USB. There is a jumper that controls how the USB ports are charged. It is described in the section “USB device wake-up” in the manual. What I did was just change the jumper position from +5V to +5VSB. After that the iPod was recognized by Windows XP SP2.

From what I could observe the iPod didn't have sufficient current so that every time it started to charge its battery the OS automatically ejected the device. This way I didn't have access to the iPod. Every time it connected and ejected automatically.

Now everything is working flawlessly and I've already synced some music. I'm listening to it.

Top-Down approach in distributed databases

A distributed database is formed by a collection of multiple databases logically interrelated in a computer network.

The top-down approach when used in distributed databases correlates a series of stages for the construction of a distributed database project beginning from the ground and is employed in homogeneous systems. The emphasis in the case of distributed databases is given to the data distribution project.

This post presents the stages of the top-down approach by means of a a schema, which gives a macro vision of the process. After that the inherent details of each process’s stage are described.

Top-Down approach
The top-down approach is employed in different computer areas. In distributed databases it correlates a series of stages to the construction of a distributed databases project beginning from the ground and is employed in homogeneous systems [1].

The top-down approach is the more usual given the fact that in the majority of the cases there isn’t a distributed database already implemented. If there is a system already established another approach called bottom-up is used.

The picture bellow shows the stages of the top-down approach employed in distributed databases:

As can be seen, in yellow are the traditional stages of the top-down model: requirements analysis, conceptual project, logical e physical project. In red is the distribution project stage that is specific in distributed databases. Note that the physical project in this case is implemented after the distribution project.

The following sections describe the stages of the top-down approach in distributed databases.

Requirements analysis
In this stage takes place the collect of information about the data, and its restrictions and relationships within the organization. The requirements analysis is realized through meetings with the users where is observed how the organization operates. In the end of the analysis a document with the requirements specification is generated.

Conceptual project
In this stage takes place the modeling of the data and its relationships independently of the structure of representation regarding the distributed database system DDS (conceptual modeling). The conceptual project is realized through the analysis of the requirements specification. In the end of the conceptual project a conceptual schema (diagram) with the correct data integrity restrictions is obtained.

Logical project
In this stage takes place the conversion of the conceptual project to the representing schema of a DDS (logical schema). The logical project is realized through the application of conversion rules, translation to the relational model of the distributed database. In the end of the logical project a logical schema with tables, stored procedures, views, access authorizations, etc. is obtained.

Distribution project
In this stage is taken the decision of how the data and programs must be allocated, fragmented through the nodes of the computer network. In some cases the network itself is designed and built to satisfy the necessities of the distributed database project. This stage is considered the most critical in the project of a distributed database.

Physical project
In this stage the logical schema is defined in a DDS suitable to the data model. The physical project is realized by means of SQL instructions. The result is a physical schema in concordance with the established in the distribution project. After finishing the physical project of each node of the computer network the distributed database is ready for use. A monitoring process is initialized and aims to discover possible errors. Such errors are the system feedback and are sent to the people responsible for the construction of the distributed database.

Conclusion
At the beginning of a distributed database project it’s extremely important to assess the organizational environment of the company that holds the data. Obviously when the company doesn’t have a distributed database back-end and legacy systems, the top-down construction approach will be necessarily employed.

As a macro overview it’s possible to infer that in the first stage a document with the requirements is generated and after that the logical and conceptual projects start. Logical and physical schemas start to be generated. With the logical and physical schemas already defined the distribution project starts and this is the most complex. After the definition of the local schema of each node of the computer network, the implementation of the local physical schema starts. At this point each network node is given the responsibility for determined tasks of the company. This means that some objects (views, stored procedures, etc.) of the database are created specifically according to each physical local schema. In the last level is the distributed database monitoring process, which helps in the discovering of bugs and propitiates at the same time the possibility of correction forwarding the bugs to the superior levels.

The top-down approach aims to structure the creation process of a distributed database. Defining and separating the construction stages in a correct manner, the database architects and other people involved in the construction of a distributed database will have more chances of achieving success in a given project. It’ll only happen if the stages are accomplished with strictness and in the established order.

References
[1] Ozsu, M. Tamer e Valduriez, Patrick. Principles of Distributed Database Systems. 2nd Edition. Upper Saddle River : Prentice Hall, 1999.

[2] Zhou, Li-Zhu. Distributed Database System Course. 2002. Available at <http://dbgroup.cs.tsinghua.edu.cn/ddb/2002/ddbHandout.zip>. Accessed on November 16, 2007.

[3] Mello, Ronaldo S. Projeto Top-Down de Banco de Dados. 2007. Available at <http://www.inf.ufsc.br/~ronaldo/ine5623/1-introdProjBD.pdf>. Accessed on November 16, 2007.

[4] Ozsu, M. Tamer e Valduriez, Patrick. Notes for "Principles of Distributed Database Systems". 1999. Available at <http://softbase.uwaterloo.ca/~tozsu/ddbook/notes/Design/Design.pdf>. Accessed on November 22, 2007.

Papers
English
http://leniel.googlepages.com/TopDownApproachDistributedDatabases.pdf

Portuguese
http://leniel.googlepages.com/AbordagemTopDownBDDistribuidos.pdf

Virtual office

A virtual office is an alternative for those that are starting up a new company because it permits the company's owner to focus more on the services being offered than all other peculiarities inherent to the establishment of a physical place and further necessities such: furniture, equipments, client reception, etc.

As an entrepreneur it’s important to know how to choose the right place for the company’s branch of activity in view of the fact that determined commercial places are more favorable to determined kinds of commercial areas.

The companies that offer virtual offices provide custom bundles for each client type (renting on determined weekdays, for example), which permits the business viability for the beginner entrepreneur. The viability will only be effective if the new entrepreneur know how to adequately choose the correct range of necessary services to his business because at the moment of bringing a company to life there isn’t the availability of a good investment capital.

As a case, I can cite the software development industry here in Brazil, where the developers have worked as an artificial person, that is, the natural person establishes a company and from that point starts to offer the development services to the more diverse clients. When an artificial person developer opens a virtual office, he earns more visibility and will be able to gain more clients through the divulgation of his work. In big commercial cities as is the case of São Paulo and Rio de Janeiro, there are developers that opt for a virtual office and this way they easily duplicate or even triplicate their incomes. Most of the times they earn more than their former boss for they have know how pertinent to their area and consequently they can leverage an excellent business. It’s interesting to note that in some cases the clients of the former boss pass to be clients of the new entrepreneur because they already know the quality of the work offered by him.

In general a developer only needs a notebook and his knowledge to start a new company. Other employees are unnecessary.

Opting for a virtual office seems to be an excellent alternative to expose the work publicly. With the business profit the developer will be able to contract more people or even invest in his professional career attending new courses and specializations. It’s also important to mention that being independent this new entrepreneur will be able to work when he wants; planning his own schedule since only he is in charge of his goals according to his real work capabilities. He will even be able to work at his own home near his family and when it is necessary, he will be able to go to the virtual office to meet with his clients and peers. This fact favors a lot the life of the professional for diverse motives, among which I can cite: health, family, comfort, leisure, etc.

So it’s possible to conclude that to establish a virtual office in certain cases is a good choice nowadays because a lot of people prefer to work for their own, be it for having their proper business, for being free from the subordination or even to have a better return of money without the harassments that arise from the business physical installation.

Flickr

This is a test post from flickr, a fancy photo sharing thing.

Critical Path Method

The critical path method or just CPM is a mathematically based algorithm for scheduling a set of project activities.

The essential technique for using CPM is to construct a model of the project that includes the following:
  • A list of all activities required to complete the project (also known as Work Breakdown Structure),
  • The time (duration) that each activity will take to completion, and
  • The dependencies between the activities.
For a test case let's assume the following picture:


In the picture above we have circles that represent activities identified by capitalized letters.

The red number inside each circle indicates the time spent to complete the activity.

The upper left and right numbers represent the earliest start time and earliest end time of each activity respectively. The lower left and right numbers represent the latest start time and latest end time of each activity respectively.

The circles with a red border represent the critical path for this given set of activities.

A class that represents each activity was firstly modeled. This class has as properties the activity's ID, description and duration along with the earliest start time (est), latest start time (lst), earliest end time (eet) and latest end time (let).

The dependencies between each activity is stored in two arrays, the successors and predecessors arrays.

public class Activity
{
  private string id;
  private string description;
  private int duration;
  private int est;
  private int lst;
  private int eet;
  private int let;

  private Activity[] successors;
  private Activity[] predecessors;

  ...
}
The CPM algorithm uses the activities data to calculate the longest path of planned activities to the end of the project, and the earliest and latest that each activity can start and finish without making the project longer.
This process determines which activities are "critical" (i.e., on the longest path) and which have "total float" (i.e., can be delayed without making the project longer).

To accomplish that two methods were created: one called WalkListAhead and the other called WalkListAback.

The WalkListAhead method receives the array that stores the activities already entered and performs the forward walking inside the array of activities calculating for each activity its earliest start time and earliest end time.

After the forward walking the WalkListAback performs the backward walking calculating for each activity its latest start time and latest end time.

See the following code:
private static Activity[] WalkListAhead(Activity[] list)
{
  list[0].Eet = list[0].Est + list[0].Duration;

  for(int i = 1; i < na; i++)
  {
    foreach(Activity activity in list[i].Predecessors)
    {
      if(list[i].Est < activity.Eet)
        list[i].Est = activity.Eet;
    }

    list[i].Eet = list[i].Est + list[i].Duration;
  }

  return list;
}
private static Activity[] WalkListAback(Activity[] list)
{
  list[na - 1].Let = list[na - 1].Eet;
  list[na - 1].Lst = list[na - 1].Let - list[na - 1].Duration;

  for(int i = na - 2; i >= 0; i--)
  {
    foreach(Activity activity in list[i].Successors)
    {
      if(list[i].Let == 0)
        list[i].Let = activity.Lst;
      else
        if(list[i].Let > activity.Lst)
          list[i].Let = activity.Lst;
    }

    list[i].Lst = list[i].Let - list[i].Duration;
  }

  return list;
}
To determine the critical path a method called CriticalPath verifies if each activity's earliest end time minus the latest end time and earliest start time minus the latest start time are equal zero. If so, then the activity is part of the critical path and its id is written in the screen. The project's total duration is also shown.

See the code:
private static void CriticalPath(Activity[] list)
{
  Console.Write("\n          Critical Path: ");

  foreach(Activity activity in list)
  {
    if((activity.Eet - activity.Let == 0) && (activity.Est -
activity.Lst == 0)) Console.Write("{0} ", activity.Id); } Console.Write("\n\n Total duration: {0}\n\n",
list[list.Length - 1].Eet); }
While developing this code I and my brother in faith Wellington Magalhães Leite had a great time together. We learned great things about data structures and we could master our programming skills.

I remember that to hand in this code regarding the Software Engineering discipline taught by Rodrigo dos Santos Macedo we worked till late evening. As a result we got a great grade!

Get the complete code at http://leniel.googlepages.com/CriticalPathMethod.rar.

Update 4/22/2011

I cross-posted this at a CodeProject article. There I show a big screenshot of the running console application with user data input. The app finds the Critical Path and Total days (duration) shown at the bottom part of the screenshot.

You can use the free Microsoft Visual C# Express to open the project and play with it. :)

Update 5/21/2011

Emil Lerch found a couple of small bugs in our original project and fixed them along the way. He has taken the CPM engine and refactored it as a generic IEnumerable extension method. He managed to write a great amount of code and I’m impressed with all the refactoring that makes use of Generics, Lambdas, etc.

Emil’s Project highlights:

Critical Paths in .NET: Extension Method

This is a rewrite of Critical Path Method Implementation in C#. It has the following features over and above the original:

  • It uses generics to avoid type dependency. Extra metadata is stored internally
  • The public method is an extension method based on IEnumerable, so any list works
  • Task information can come in any order. Pass in a lambda to tell the engine how to get a task's predecessors and another lambda to get the task length and it will figure out the rest
  • If a loop is detected in the path, an exception will be thrown

It is used in a production web site and is stable at this point.

His version of our code can be found at:

https://github.com/elerch/Critical-Path-Extension-Method-for-.NET

First post of a just graduated computer engineer

Hi,

I'm a computer engineer and in this blog I'll share with the world what I've developed as well as what I'll develop in the days to come. Your feedback is highly appreciated.

Edited on September 26th, 2009

This blog is the way I found to improve my English writing skills and to give back to the world the marvelous knowledge I acquired during the past years being taught by great professors and learning a bit here and there on the internet.

I’ve been using the internet for 10 years now and it has proved to be the best source of information to me.

I hope you find the content of this blog useful and that you can use it in your own endeavors - be it for learning purposes or for professional work.

Thanks for visiting,

Leniel Macaferi