Saturday, July 25, 2015

Human Resource Management, Talent Management, Performance Review, Annual Review

In recently: "In big move, Accenture will get rid of annual performance reviews and rankings". Sounds too good to be true. And indeed with my insider source :), "Get Rid" is probably an exaggeration.

Human Resource Management, Talent Management, Human Capital Management, Performance Review, Annual Review. What ever your whizzy HR department like to call it. 9 out of 10 people dread all the paper work. However, does this mean it is a completely waste of time? Definitely not! Just put yourself in the boss shoes. You are running a company with hundreds and thousands of people, and it is no secret every body wants a raise. How would you manage these expectations?

Do it boss free like Valve? What does it really mean though? From the article:
A place where employees sit where they want, choose what to work on and decide each other's pay
But it fail to give much detail. I love to know more if anybody knows how it works in Valve.

The way how Valve works may sound a little extreme, but is it really? Compare to traditional performance management were your manager decides your faith, The general idea where your peers has more input into your review process had a lot more meat to it. After all, if it is your manager whom mostly decide you faith, what does a review process like this implies/encourage?

Here is a quote from the Washington post:
“Employees that do best in performance management systems tend to be the employees that are the most narcissistic and self-promoting,” said Brian Kropp, the HR practice leader for CEB. “Those aren’t necessarily the employees you need to be the best organization going forward.”
Here is the axioms for modernizing review process:
  1. Review process should be done with people which the employee interact the most with.
  2. The feedback we solicit for should be concise. 
1. Review by people whom they interact with most
With a significant portion of communication done digitally today, it is not hard to extract a social graph of the employee's digital interaction. 

2. Concise feedback
How about some simple multiple questions which are easily to measure. For example, something like this:
  • If you are assigned to another country, working in the same capacity, given the options, you wish to continue to work with "John Smith":
    • Strongly agree
    • Agree
    • May be
    • Disagree
  • You would recommend "John Smith" for a promotion
    • Strongly agree
    • Agree
    • May be
    • Disagree
Taking advantage of a digital medium and concise multiple choice question, we can solicit these feedback much more often. I postulate we can supplement any review process by gather much more meaningful data, a better view of employee's behavior and encouraging team work rather than pleasing their manager.

Sunday, May 31, 2015

Bitcoin Faucet - And I actually got paid by one of them

In the past weekend, there was a Bitcoin-themed hackathon in Hong Kong. Although I didn't participate, it did bring my attention to bitcoin again and I did a little bit of research about it.

While I was doing my research, I learn about these little sites called "Bitcoin faucet". For those of us old enough to know about those get-paid-to-surf-the-net-schemes back in the 90s (e.g. AllAdvantage, are the still around?), are they back?

At first I was skeptical, but I figure I will give them a try. Of the 7-ish Bitcoin faucets I tried over the week, one of them actually did payout. The faucet that paid out is

And here is a screenshot of the transaction receiving the bitcoin!

That's right. A Grand Total of $0.14 USD. Is it worth the time? Probably not. But at the end of the day, what intrigues me is the ability to enable micro-transactions. After all, paying out $0.14 USD by any other means, the transaction cost is probably more than the actual amount transferred.

Like it or not, Bitcoin or some other crypto-currency technologies like this will open a whole new world for us.

P.S. Wanna try out the bitcoin faucet? Here is the link to it again.

Saturday, March 28, 2015

Javascript oddities #1

var func = function() {}
console.log(func.prototype.constructor == func); // return true

Thursday, March 12, 2015

JHipster: A code generator with a truck load of tech for AngularJS and Spring Boot based projects

I recently came across a JHipster - a Yeoman-based generator, which generates a based project which includes a truck load of technologies (taken directly from JHipster's Technology Stack page):

Technology stack on the client side

Single Web page application:

  • Responsive Web Design
  • HTML5 Boilerplate
  • Twitter Bootstrap
  • AngularJS
  • Full internationalization support with Angular Translate
  • Optional Compass / Sass support for CSS design
  • Optional WebSocket support with Spring Websocket

With the great Yeoman development workflow:

  • Easy installation of new JavaScript libraries with Bower
  • Build, optimization and live reload with Grunt or Gulp.js
  • Testing with Karma and PhantomJS

And what if a single Web page application isn't enough for your needs?

  • Support for the Thymeleaf template engine, to generate Web pages on the server side

Technology stack on the server side

A complete Spring application:

  • Spring Boot for easy application configuration
  • Maven or Gradle configuration for building, testing and running the application
  • "development" and "production" profiles (both for Maven and Gradle)
  • Spring Security
  • Spring MVC REST + Jackson
  • Optional WebSocket support with Spring Websocket
  • Spring Data JPA + Bean Validation
  • Database updates with Liquibase
  • MongoDB support if you'd rather use a document-oriented NoSQL database instead of JPA
  • Cassandra support if you'd rather use a column-oriented NoSQL database instead of JPA

Ready to go into production:

  • Monitoring with Metrics
  • Caching with ehcache (local cache) or hazelcast (distributed cache)
  • Optional HTTP session clustering with hazelcast
  • Optimized static resources (gzip filter, HTTP cache headers)
  • Log management with Logback, configurable at runtime
  • Connection pooling with HikariCP for optimum performance
  • Builds a standard WAR file or an executable JAR file
Although I did not use it for any of my projects (yet), it is a great reference to see how to setup a project which truly separate the front and back development. What I meant by that is the project is setup where the front-end can be served via 'grunt serve', i.e. NodeJS, decoupled from the back-end Spring Boot server. Yet, we all these goodies, you can still easily call 'mvn package' to build a complete Spring Boot powered executable JAR.

It is a great project to get a glimpse of all these technologies and how they can integrate together. More importantly, it set up a viable project which separates but integrated workflow for front-end and back-end. After working with it for a bit, I do have some reservations and comments, but that for another post.

Have you used JHipster in your projects? In a production setting? If so, I love to hear your comments.

Monday, December 15, 2014

SOAPUI 5.0.0 hangs after upgrading OS X to Yosemite

After upgrading to the company's Mac OS X to Yosemite, SOAPUI 5.0.0 refuse to load properly. It will start, and the UI will come up, but it just hang with the spinning wheel right away.

I was able to resolve this issue by uncommenting the line #53 in $SOAP_HOME/bin/

#   JAVA_OPTS="$JAVA_OPTS -Dsoapui.browser.disabled=true"

I hope this help someone else out there who has the same problem, and also for myself to reference again if face with the same problem in the future.

Sunday, April 6, 2014

Getting edx devstack to run on Windows

1) Fix issue

2) Change Vagrant ansible-play command to

ansible-playbook -i localhost, -c local vagrant-devstack.yml --tags=deploy -e configuration_version=master -e edx_ansible_source_repo= -e edx_platform_repo= -e edx_platform_version=master -vvv

3) Fix symbolic link issue
 # You need to run this from cygwin, not the Windows command-line (see above)
 git rm --cached -r . && git reset --hard
 git config --global alias.add-symlink '!__git_add_symlink(){ dst=$(echo "$2")/../$(echo "$1"); if [ -e "$dst" ]; then hash=$(echo "$1" | git hash-object -w --stdin); git update-index --add --cacheinfo 120000 "$hash" "$2"; git checkout -- "$2"; else echo "ERROR: Target $dst does not exist!"; echo "       Not creating invalid symlink."; fi; }; __git_add_symlink "$1" "$2"'
 git config --global alias.rm-symlink '!__git_rm_symlink(){ git checkout -- "$1"; link=$(echo "$1"); POS=$'\''/'\''; DOS=$'\''\\\\'\''; doslink=${link//$POS/$DOS}; dest=$(dirname "$link")/$(cat "$link"); dosdest=${dest//$POS/$DOS}; if [ -f "$dest" ]; then rm -f "$link"; cmd //C mklink //H "$doslink" "$dosdest"; elif [ -d "$dest" ]; then rm -f "$link"; cmd //C mklink //J "$doslink" "$dosdest"; else echo "ERROR: Something went wrong when processing $1 . . ."; echo "       $dest may not actually exist as a valid target."; fi; }; __git_rm_symlink "$1"'
 git config --global alias.rm-symlinks '!__git_rm_symlinks(){ for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; do git rm-symlink "$symlink"; git update-index --assume-unchanged "$symlink"; done; }; __git_rm_symlinks'
 git config --global alias.checkout-symlinks '!__git_checkout_symlinks(){ POS=$'\''/'\''; DOS=$'\''\\\\'\''; for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; do git update-index --no-assume-unchanged "$symlink"; if [ -d "$symlink" ]; then dossymlink=${symlink//$POS/$DOS}; cmd //C rmdir //S //Q "$dossymlink"; fi; git  checkout -- "$symlink"; echo "Restored git symlink $symlink <<===>> `cat $symlink`"; done; }; __git_checkout_symlinks'
 git rm-symlinks
4) Before running `vagrant provision`, comment out the checkout and clean resets (if left in playbook, it will resets the above fix)


Monday, January 20, 2014

Co-working spaces in Hong Kong - - (no longer in operation)
Cocoon -
the Hive -
The Good Lab -
Fill in the blank -
PaperClip -
80/80 Space -
The Loft -