Blog | jessechen.net

Personal Finance for Young Professionals

April 3, 2013 9:16 am by
makeitrain

One of the most valuable classes at Cal that I attended was not an engineering class, nor was it technical.  It was UGBA 196, Personal Financial Management.  Professor Selinger seared into our brain about “the magic of compounding” and how it is ever so important that managing your personal finance while you are still young will reap benefits orders of magnitudes higher than if you started later.

I’m writing this guide because ever since I took that class, I have learned how important it is to understand personal finance, and that especially for young working professionals, it is extremely important to start saving correctly right now.  I am not claiming to be an expert (hardly one) in managing money, and you definitely should do your own research before doing anything.  But I hope this is a guide that will help jump-start or help get you on track to managing your money right. (more…)

About

Jesse is a software engineer at Facebook, who just graduated from UC Berkeley. Passionate about mobile technology and entrepreneurship, he started his own blog as a home for his tutorials, projects, and random thoughts. Follow him on Facebook to stay updated on his latest tutorials and projects.


Protip: How to be a Good Boss

May 10, 2012 8:45 pm by
Rescomp Network Engineering Assistants

Today was my last day at ResComp after working 7 semesters there.  Rewind 3 years and 3 months back when I applied for the Lead position for the Network Engineering Assistant team.  I was applying for multiple positions within ResComp, and I figured, why not try to apply for a supervisor position?  While I was debating whether I should do it, I remembered the saying

I do not regret the things I’ve done, but those I did not do

And looking back today, I am so glad that I decided to apply for the hell of it.  The past 7 semesters working in that position has provided me with invaluable experience, friends, and memories.  Specifically, I want to emphasize how great it was to have a job while being in school.  It provided structure to my schedule, some extra money to splurge, and taught me many skills that I lacked.

Because the Lead position is a supervisory role, it required project management and management skills.  Coming in as a freshman, this job taught me how to lead and manage a team, and boosted my confidence and public speaking skills.  Anyone that knew me in high school knows that I used to be pretty shy and quiet.  Now I won’t shut up sometimes.  You can blame this job for it — because I had to be able to communicate internally within my team, as well as externally, providing workshops and presentations for other IT staff.

I wrote a protip article for the incoming Lead that will be replacing me, and I figured I would share it here as well.  Below are my thoughts on how to be a good manager and what my experiences were as the Lead for the Network Engineering Assistant team.  Enjoy.

Introduction

Hi, so I was the first Lead for this team when I came onboard in 2009 as a freshman. The position just opened up and the NEA team was looking for someone to lead the team for the first time. The current team at that time was all juniors or seniors. You can imagine that it must’ve been an interesting time when a freshman was responsible for supervising a team of 3rd and 4th year students. Since then, the team has gone through many changes and the Lead is primarily responsible for building the team that they want to have. As I am about to graduate and leave this position, I want to close with some of the insights I’ve learned over the years as well as some advice for you to consider.

Communication

It goes without saying that you need to have excellent communication skills to be successful. You are serving as the representative for the NEA team internally and externally. You need to be able to communicate with all your peers on the team, as well as get your point across with the career staff that we work closely with (Leslie, Greg, Mike). Externally, your role might not be as pronounced, but you will be responsible for attending SAIT-wide meetings, as well as attending parties and events that concerns the Leads. Something I didn’t do well was being the external representative for our team. Coming in as a freshman gave me a lot of time to try to get to know others, but everyone already knew each other and I was an outsider (being the first Lead for a team that didn’t have one means not having a mentor to help me introduce/network). Right now (2012) is a good time to be a new Lead because multiple Leads are graduating which means more new faces that are looking to make new friends. Learn to communicate successfully to other people internally and externally.

Our team is isolated from the rest of Rescomp. We don’t work with other teams (very rarely), and our work typically does not involve much interaction with other teams. For example, RCCs will typically initially diagnose an In-Room Connection (IRC) problem, and then create a ticket for us which we handle the rest. Same with Desktop but for career staff problems. Due to the nature of our work, it will be difficult to make connections with other teams in SAIT. However, you should because they can end up helping you one day with an issue related to them. I feel like I didn’t do a good job on this aspect, but you should. Get to know other Leads and people from other teams. Lastly, you will be leading workshops and presentations for other people in SAIT occasionally. Personally, I find those exciting because a) I like to speak in front of a crowd, and 2) I get to share with other people what my team does. Be confident in your public speaking abilities.

Lead/Senior Relationship

The Lead and the Senior position (edit: Senior position is the team lead for technical aspects) works closely together to ensure that the rest of the team knows what needs to be done when they come in to work. You guys must work together to provide documentation, assign tasks, and keep everyone updated on projects. One thing that I did not do during my time as the Lead is to establish a weekly or bi-weekly meeting with the Senior. I highly encourage meeting with your Senior(s) weekly to stay in sync. I noticed that because I did not do this, I would often times be out of the loop when it concerns projects. I was too focused on administrative tasks that I lost track of the current progress on our projects, and felt lost. It’s too late for me to fix that, but I hope that this doesn’t happen to you. Conduct weekly meetings with the senior(s).

Team Building/Dynamics

One of the most important things to understand as a Lead is that you aren’t there to micro-manage your team and make work a place that causes your team to hate coming in to work. As the Lead, you facilitate, which means letting your teammates make their own decisions and allow them to be responsible for their own actions. You are there to encourage them and prod them to the right direction. You work for them, not the other way around. Do not ever micro-manage.

Take the effort to know each person on your team and be friendly to all. Do not show or encourage any favoritism, and try to show interest in their lives outside of work. When working together, ask about how school is going, or how their extracurricular activities are going, and get to know them better outside of a work relationship. I want you to feel comfortable enough with every single person on the team that you would be willing to eat lunch one-on-one with them. As students of the same university, there should be a lot in common to talk about. When I go out on duty, especially with a new hire, I try to be friendly to show them that even though we’re at work, we can still have fun and get to know each other. It makes them feel included in our team, and promotes the same kind of interaction among other teammates. I find that when I am friends with the people I work with and know that we have lots of interesting conversations when we’re together, it makes work that much more enjoyable. Get to know every single person on the team.

Gaining Respect From Your Team

Respect is hard to earn, and (should be) hard to give. In our team, you need to have the respect of your team in order to be successful as the Lead. If you are lazy and always in the office pretending to do ‘admin work’, they won’t respect you when you assign them tasks. If you lack the technical understanding of our job, then your team will think you are just a management figure that they can’t relate to, since you do not fully understand the type of work your own team does and you’re just talking out of your ass. Although you may have a lot of administrative or organization work, you should take the effort to go out in the field on occasion. Many times, our team will need someone to volunteer to cover a shift or to do a task that no one wants. You, as the Lead, need to hustle and selflessly volunteer for those times to demonstrate to the team the kind of expectations that you want to hold them accountable to. Lead by example, and not by say!

Hiring

As the Lead, you are responsible for leading the hiring process every year. You have to be really organized and on top of things during this time (usually around february/march). That includes blocking times off on a meeting room’s calagenda for interviews, coordinating with the Senior, your supervisor, and others to interview and make hiring decisions, and preparing hiring materials (resume, cover letter, interview packet) for everyone. As the Lead, you have the strongest influence on who gets hired to be on your team. I want you to think about “would this person get along with the rest of my team”, and how their personality fits within your team. Our position does not demand a high level of technical expertise prior to hiring since our job is mostly learn-as-you-go, so you should focus on thinking about team fit and the ability to learn quickly.

Over the course of 3 years, I have hand-picked my team from hundreds of candidates. I generally like to look for people who are eager to learn, have the time availability (not too overworked academia i.e. triple major with 5 extracurricular activities), and have a personality that gels with the rest of the team. The other people on your interview committee may want to focus on technical skills, or time availability, but for you, as the Lead, focus on the big picture and see if the candidate is a good match with the rest of the team.

Conclusion

The work that we do is tough. Not just physically, but also mentally. Our team does a lot of grunt work and cleaning that makes even the toughest of us want to quit. This job isn’t easy, and we had several people that left the team because they either couldn’t handle the type of work that we do or they mentally check out. As the Lead, you have to do your job of being cheerleader. Keep the morale of the team up, make it fun and exciting to come to work, and unite the team. You know you’re doing it right when you walk into the team meeting and see your whole team laughing and having a good time together.

Network Engineering Assistants, Spring 2012.

 

Filed under: How to — Tags: , , , , , , , — Jesse Chen @ 8:45 PM

About

Jesse is a software engineer at Facebook, who just graduated from UC Berkeley. Passionate about mobile technology and entrepreneurship, he started his own blog as a home for his tutorials, projects, and random thoughts. Follow him on Facebook to stay updated on his latest tutorials and projects.


How to NFC on the Android Platform

August 30, 2011 12:51 pm by
Android and NFC

Introduction

Starting with Android 2.3, the platform includes an NFC stack and framework API that allows you to read/write to NDEF (NFC Forum Data format) tags.  For Android smartphones, that means the requirement is to be running at least Android 2.3 and have a NFC chip on the phone. For iOS, we’ll have to see if the rumors are true that the iPhone 5 is NFC-enabled :).

The only resource I used was the 2011 Google I/O NFC Talk:

and the Sticky Notes demo source code from the NFC talk above.

Let’s pretend that you are an engineer at Facebook working on the Android app, when suddenly the PM tells you that they want to integrate NFC into the Facebook app. Some basic functionality that they want implemented to get started with is to be able to add friends, and check in to places instantly via NFC. This would be a simple way to get started..

(there is no Facebook for Android source code here, I’m writing this tutorial as if we were writing for the app)

P2P Data Transfer – Add Friends Example

Two NFC-enabled devices have the ability to transfer data to each other simultaneously.  For example, two people who just met with NFC-enabled phones can quickly touch their phones together to automatically add each other as friends on Facebook.

To begin, both phones have to be running the same Activity in the foreground in order to work.  Let’s call this Activity ‘NfcAddFriendsActivity’.

In NfcAddFriendsActivity’s onCreate method, we have the following code:

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0,
    new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Intent filters for exchanging over p2p.
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
    ndefDetected.addDataType("text/plain");
} catch (MalformedMimeTypeException e) {
}
mNdefExchangeFilters = new IntentFilter[] { ndefDetected };

This sets up the different intents that are needed in order for p2p to work.  mNfcPendingIntent is a generic PendingIntent that will be delivered to this activity, Android fills the intent later with the details from the discovered tag before sending it to this activity.  The nDefDetected IntentFilter is set to filter for the intent NfcAdapter.ACTION_NDEF_DISCOVERED with the mime type “text/plain”.  So there will be a dispatch to the foreground Activity when Android receives an intent matching the IntentFilter we just created.

The next step is to enable pushing NDEF messages and receiving NDEF messages.  That means in our onResume method, we call enableNdefExchangeMode which looks like:

private void enableNdefExchangeMode() {
    mNfcAdapter.enableForegroundNdefPush(NfcAddFriendsActivity.this,
        NfcUtils.getUidAsNdef(mUserId));
    mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, 
        mNdefExchangeFilters, null);
}

These method calls are what allows our device to initiate p2p communiation via NFC.  NfcUtils.getUidAsNdef is the method that creates a NDEF message with mime type “text/plain” with the user’s UID as the payload.  enableForegroundNdefPush will push this message to the other device.  enableForegroundDispatch will set up the listener for the intent that we are filtering for such that when it detects an intent matching the intent filter, it calls our activity’s onNewIntent method:

@Override
protected void onNewIntent(Intent intent) {
    // NDEF exchange mode
    if (!mWriteMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        NdefMessage[] msgs = NfcUtils.getNdefMessages(intent);
        fireFriendRequest(msgs[0]);
        Toast.makeText(this, "sent friend request via nfc!", Toast.LENGTH_LONG).show();
    }
}

Here, it parses the received NDEF message and gets the payload which should be the other user’s UID.  Then I call fireFriendRequest which is a method that we can assume sends a friend request to the UID that was given.

NfcUtils.getNdefMessages is below, exactly the same as the Sticky Notes demo:

NdefMessage[] getNdefMessages(Intent intent) {
    // Parse the intent
    NdefMessage[] msgs = null;
    String action = intent.getAction();
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
        || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        Parcelable[] rawMsgs = 
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        } else {
            // Unknown tag type
            byte[] empty = new byte[] {};
            NdefRecord record = 
                new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
            NdefMessage msg = new NdefMessage(new NdefRecord[] {
                record
            });
            msgs = new NdefMessage[] {
                msg
            };
        }
    } else {
        Log.d(TAG, "Unknown intent.");
        finish();
    }
    return msgs;
}

Writing to a NFC Tag – Checking into Places Example

Let’s create a way for people to check in to places simply by tapping on a NFC tag.  To start, we need to write some data onto a NFC tag, such that when the user taps on the tag, an Activity will launch based on the type of data stored on the tag.  Well, each Facebook “Place” has an id associated with it, so lets write those ids onto NFC tags such that when a user taps on the tag, we can launch the correct Activity, passing the id as a parameter.

Lets assume you have a list of Facebook Places, and when the user clicks on a Place, we prompt them to touch the phone to the tag to write that corresponding Place id onto the tag.  So, when the user taps on a place, onListItemClick is called and this is what happens:

...

Place place = (Place) mListAdapter.getItem(position);

// NFC: Write id to tag
placeidToWrite = place.mPlaceId;
enableTagWriteMode();

new AlertDialog.Builder(NfcWriteCheckinActivity.this).setTitle("Touch tag to write")
    .setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            disableTagWriteMode();
        }
    }).create().show();

...

I hold the placeid in placeidToWrite, and call enableTagWriteMode.  An alert dialog pops up prompting the user to tap the phone to the tag to write.  enableTagWriteMode below:

private void enableTagWriteMode() {
    mWriteMode = true;
    IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    mWriteTagFilters = new IntentFilter[] { tagDetected };
    mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mWriteTagFilters, null);
}

I create a new IntentFilter for the intent NFCAdapter.ACTION_TAG_DISCOVERED, which is the intent to start an Activity when a NFC tag is discovered.  Then, like in the adding friends example, enableForegroundDispatch is called to dispatch a discovered tag to the foreground activity.  Once this is all set up, and the user taps the phone onto a tag, the ACTION_TAG_DISCOVERED intent is detected and onNewIntent is called:

@Override
protected void onNewIntent(Intent intent) {
    // Tag writing mode
    if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (NfcUtils.writeTag(NfcUtils.getPlaceidAsNdef(placeidToWrite), detectedTag)) {
            Toast.makeText(this, "Success: Wrote placeid to nfc tag", Toast.LENGTH_LONG)
                .show();
            NfcUtils.soundNotify(this);
        } else {
            Toast.makeText(this, "Write failed", Toast.LENGTH_LONG).show();
        }
    }
}

NfcUtils.getPlaceidAsNdef takes the placeid and creates a NDEF message with mimetype “application/vnd.facebook.places”, which is a custom and vendor-specific mimetype that I made up to distinguish the different NFC tags (places, url, pages) for Facebook.  That way, when the phone reads a NFC tag, it knows which Activity to launch (I detect mimetype “application/vnd.fb.places” – I should launch this specific Activity from Facebook).

NfcUtils is my handy utility class for all things NFC.  NfcUtils.getPlaceidAsNdef looks like:

/*
* Converts a Long into a NdefMessage in application/vnd.facebook.places MIMEtype.
*
* for writing Places
*/
public static NdefMessage getPlaceidAsNdef(Long id) {
    String msg = ((Long) id).toString();
    byte[] textBytes = msg.getBytes();
    NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
        "application/vnd.facebook.places".getBytes(), new byte[] {}, textBytes);
    return new NdefMessage(new NdefRecord[] { textRecord });
}

Once you construct the NDEF message, you need to actually write it to the tag.  NfcUtils.writeTag looks like:

/*
* Writes an NdefMessage to a NFC tag
*/
public static boolean writeTag(NdefMessage message, Tag tag) {
    int size = message.toByteArray().length;
    try {
        Ndef ndef = Ndef.get(tag);
        if (ndef != null) {
            ndef.connect();
            if (!ndef.isWritable()) {
                return false;
            }
            if (ndef.getMaxSize() < size) {
                return false;
            }
            ndef.writeNdefMessage(message);
            return true;
        } else {
            NdefFormatable format = NdefFormatable.get(tag);
            if (format != null) {
                try {
                    format.connect();
                    format.format(message);
                    return true;
                } catch (IOException e) {
                    return false;
                }
            } else {
                return false;
            }
        }
    } catch (Exception e) {
        return false;
    }
}

And that’s how you write to a tag.  Now, any person with an Android NFC-enabled phone with this build of Facebook for Android would just have to touch their phone onto the sticker (doesn’t need Facebook to be in the foreground), and wham, it takes you straight to the checkin activity with the place already set.

Reading from a NFC tag – Checking into Places Example

Now, we’ll talk about how the phone reads the tag and launch the appropriate Activity.

In the AndroidManifest, we need to write intent-filters that captures the different intents we created with our examples above.  Such that when the Android phone receives the intent, it knows where to pass it along. For checking in, we have an Activity called, lets say, CheckInActivity.  Within the activity, I am going to write an intent-filter that matches the exact intent I created in the NfcWriteCheckinActivity.

This is a snippet of the AndroidManifest for the app:

<activity android:name=".CheckInActivity">
    <intent-filter>
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
      <data android:mimeType="application/vnd.facebook.places"/>
      <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Notice the exact specification of the mimetype, which is the custom vendor mimetype that I created for checking in to places.  That way, I can have one application, like Facebook, pass different intents to different Activities within Facebook.

Within CheckInActivity, it is fairly simple to extract the placeid and open the checkin activity.  You do it in the onResume method of CheckInActivity:

@Override
protected void onResume() {
    super.onResume();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
        NdefMessage[] messages = NfcUtils.getNdefMessages(getIntent());
        byte[] payload = messages[0].getRecords()[0].getPayload();
        String placeId = new String(payload);
        NfcUtils.soundNotify(this);
    }
}

Note: The user ID and the place ID are all written and transmitted in plaintext with no authentication or encryption. FWIW, that may or may not be acceptable for some apps. I haven’t looked into the security implications on NFC, but if you are passing confidential data, you will have to find a way to encrypt the data before writing, verifying the integrity of the data when receiving, and authenticating the entity that sent the data. Since this was a personal hackathon project, I did not implement any security features.

Background

Last semester, I was in IEOR 171 – Technology Leadership which is a course where you form small groups to hypothesize and analyze an industry change in the next ten years.  During the beginning of the semester was around the time when Google’s mobile payment service via NFC was leaked, as well as when Gingerbread (Android 2.3) was announced, which is the first version of Android that includes an NFC stack.  It was the first time I heard of NFC and I thought that it had tremendous potential for different applications on mobile phones.  So I proposed to my group that we research the potential for NFC technology in the United States for the next ten years in the United States.  My group was enthusiastic about it, and you can read our final paper in the IEOR 171 section.

Last summer, I interned at Facebook and one of the best things about working there are the hackathons – all night coding sessions with beer, music, and takeout food where you can work on a team or by yourself to build a product out of an idea.  Being excited about NFC (see above), I decided to integrate NFC technology into the Facebook for Android app as a personal hackathon project.  Overnight, I was able to have a working build of the Facebook app where you can add friends, check in to places, share URLs, and go to a Page via NFC.

I pitched my hackathon project to the Product Managers, Directors, and even Zuck himself (emailed him some demos but he didn’t respond haha).  They all said that it was awesome but the problem was not enough NFC-enabled phones in the market – so unfortunately, it is not happening.

I didn’t want all that work to be wasted, so this is a tutorial on how to integrate NFC technology on the Android platform in hopes that people can use it to build cool applications that uses NFC!

You can also read about my second hackathon project, implementing Google Plus’s Instant Upload feature on Facebook.

Do you enjoy reading my posts? Subscribe to me on Facebook below to stay updated!

About

Jesse is a software engineer at Facebook, who just graduated from UC Berkeley. Passionate about mobile technology and entrepreneurship, he started his own blog as a home for his tutorials, projects, and random thoughts. Follow him on Facebook to stay updated on his latest tutorials and projects.