12 thg 6, 2018

Trở thành người làm sản phẩm?

Năm 3, khi còn ngồi trong trường đại học, mình đã rất may mắn khi được 1 anh khoá trên đã ra trường giới thiệu cho công việc full time đầu tiên. Công việc đến rất tình cờ và đến bây giờ mình cũng chưa biết tại sao anh đó biết biết rằng mình biết ngôn ngữ lập trình đó mà giới thiệu công việc cho vì trước đó cũng chưa đụng chạm người anh gặp đó lần nào. Sau này biết được rằng bác đó khá giỏi trong việc học tập, là 1 trong 2 người tốt nghiệp nhất khoa của trường mình, vào làm cho 1 công ty Game lớn nhất tại thị trường Việt nam và bây giờ hiện là người làm sản phẩm ‘best of the best’ của Grab, công ty gọi xe lớn nhất thị trường Đông Nam Á. Người anh mà mình được gặp đúng 1 lần cũng trong buổi phỏng vấn đầu tiên trong đời.
Đại ý là thế này. Anh này làm Developer ở công ty. Sếp của anh này làm cố vấn cho 1 công ty startup mới thành lập đang cần tìm nhân sự cho 1 mảng mới nên nhờ nhân viên cấp dưới giới thiệu cho các bạn sinh viên đã biết. Và mình may mắn đúng target của anh. Một hôm mình nhận được tin nhắn ”Em muốn đi làm không? Có công ty này hay lắm.” Ban đầu cũng hơi bất ngờ và hoài nghi. Sau thì cũng nhận vì đằng nào cũng đang rảnh, đồ án thì đã xong mà gia đình thì ở xa, thế là nhận lời phỏng vấn. Buổi phỏng vấn đầu tiên trong sự nghiệp là ở 1 quán cafe gần nhà của người sếp này(Sau này anh boss này giúp đỡ mình rất nhiều trong công việc). Hôm đó chạy con Wave Alpha đến gặp vào buổi chiều, buổi phỏng vấn mà không phải phỏng vấn. Boss chỉ hỏi về các đồ án từng làm trong trường, bảng điểm thế nào, đã thích đi làm chưa. Và sau đó có giới thiệu qua về công ty như sau. Công ty này là công ty chuyên outsource nghĩa là làm các dự án cho công ty, tổ chức bên ngoài và thu tiền công thực hiện dự án đó. Và nếu vào thời điểm phỏng vấn khác thì mình đã làm outsource rồi và có khi page này nên đặt là người làm outsourcing. Cơ duyên là công ty này đang muốn mở 1 mảng product làm 1 số sản phẩm nội bộ do công ty phát triển và phát hành. Lĩnh vực được chọn là làm game. Sau đó boss này hỏi mình thích không? Mình ok và deal done. Buổi phỏng vấn đầu tiên kết thúc. Sau buổi đó mình có mặt ở công ty gặp boss trực tiếp vài lần, chủ yếu để làm hợp đồng và xem nơi làm việc.
Đấy là câu trả lời tại sao mình trở thành người làm sản phẩm. Câu trả lời chỉ gồm 2 chữ May mắn và việc chọn người.

Lời mở đầu

Trước khi viết về những câu chuyện, xin nói rõ hơn về mục đích ra đời của page là muốn mọi người có cảm nhận và nhìn nhận về công việc của việc phát triển sản phẩm trong các công ty công nghệ, từ lúc sơ khai ý tưởng, ra đời, thực hiện ý tưởng cho đến lúc sản phẩm cất cánh được hàng triệu người biết đến. Hàng loạt các câu chuyện gặp phải trong quá trình này.
Để bắt đầu xin nói về câu hỏi mà gây nhiều tranh cãi “Người chọn việc hay việc chọn người?”, nó giống như “Con gà có trước hay quả trứng có trước”. Dù bạn ở trường phái nào, chọn phương án nào thì cũng chúc mừng bạn vì bạn đã có quyết định của riêng mình. Còn riêng, tôi trong trường hợp của tôi, “Việc đã chọn người”. Tôi bắt đầu được tham gia vào làm các sản phẩm một cách tình cờ, không như dự định ban đầu đề ra. Khi còn đang thực tập tốt nghiệp cho đến khi ra trường tôi không có ý định sẽ đầu quân cho 1 công ty startup làm về sản phẩm nghĩa là công ty này có ý tưởng về một sản phẩm nào đó có khả năng đáp ứng nhu cầu nào đó, sau đó tự lên kế hoạch phát triển và phát hành ra thị trường. Nó khá giống với việc bạn kết hôn và sinh ra 1 baby vậy. Bạn có trách nghiệm và nghĩa vụ nuôi baby đó lớn lên. Nó khác hoàn toàn với các công ty outsourcing. Các phần sau sẽ nói rõ hơn về sự khác biệt giữa các công ty làm sản phẩm ‘product’ và các công ty gia công ‘outsourcing’. Việc may mắn được tham gia vào các công ty startup chuyên làm sản phẩm và các công việc này đã chọn tôi đã mang lại cho tôi rất nhiều trải nghiệm sâu sắc, khác biệt về công việc của việc phát triển sản phẩm, sau này gọi là mindset của người làm sản phẩm.
Nếu xem sản phẩm của công ty như một MV thì những người tham qua vào quá trình làm ra đều được gọi là người làm sản phẩm. Đó có thể là người lên ý tưởng, người biên tập, quay phim, sản xuất, tất tần tật để cho ra đời MV đó. Điều khác biệt MV thành công hay không chỉ là kết quả của MV đó đạt được mục đích đề ra hay không như ý nghĩa truyền đạt, lượt xem, tầm ảnh hưởng của sản phẩm đến công chúng, doanh thu... Việc phát triển một sản phẩm công nghệ cũng như vậy.
Với người dùng họ nghĩ rằng việc thành công nhất của một sản phẩm là tiền nghĩa là sản phẩm mang lại giá trị lớn, tầm ảnh hưởng rộng là thành công. Còn với chính người làm sản phẩm đó, thành công chính là sự ghi nhận những nỗ lực được đền đáp xứng đáng trong quá trình làm sản phẩm đó. Những cảm xúc trong quá trình làm từ lúc Product in development, first user, cho đến khi được mọi người biết đến. Đó là cảm xúc khi sản phẩm của mình được hiện diện ở mọi nơi từ poster ở rạp phim, decan trên xe buýt, hay chính trên banner quảng cáo trong cái điện thoại của thằng bạn đang chơi game bên cạnh. Đó là sự ghi nhận lớn nhất mà người làm sản phẩm cảm nhận và tự hào.
Bài viết này sẽ là các câu chuyện mà bạn gặp phải trong quá trình làm sản phẩm. Nếu bạn làm ở ngành nghề khác, bạn có thể hình dung được việc phát triển 1 sản phẩm công nghệ mà bạn đang dùng như Zalo, Facebook, Instagram,... là như thế nào, tại sao những sản phẩm đó có mặt trên thế giới này và nó ra đời như thế nào... Còn nếu bạn đang làm việc trong ngành tech, trong các công ty công nghệ bạn sẽ bắt gặp đâu đó là hình ảnh của chính mình, là công việc đang từng thực hiện, là cảm xúc thật bạn đã trải nghiệm qua.
Xin nhắc lại, những câu chuyện này luôn là sự thật, ghi lại những khoảnh khắc thật từ những con người thật. Đó chính là sứ mệnh của Page!

25 thg 5, 2012

Làm việc với Service trong Android.

Bài viết nhằm mục đích hiểu về gọi đến 1 service theo con đường gọi phương thức bindService() trong lập trình Android.
Mục tiêu : Tạo 1 service có chức năng tính toán và trả về kết quả của phương thức cộng 2 số nguyên.

Màn hình chương trình khi gọi phương thức cong2so(5,5) từ 1 service như sau :

Hàm onCreate(bundle) : nhận các đối tượng về từ giao diện :

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.tv);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }

Trước hết, tạo 1 lớp có tên là MyService mở rộng từ lớp Service như sau :
public class MyService extends Service {

    // Binder cho cac client
    private final IBinder mBinder = new LocalBinder();
   
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return mBinder;
    }
    //phương thức cho các client có thể gọi.
    public int cong2So(int a, int b){
        return a + b ;
    }
   
    public class LocalBinder extends Binder {
        // Trả về đối tượng MyService để cho client có thể gọi public method
        MyService getService(){
            return MyService.this;
           
        }       
    }
}

Trở lại Activity chính của ứng dụng :

Trong hàm OnStart() chúng ta dùng phương thức bindService(parameter) để gọi đến MyService thông qua đối tượng Intent .
 
@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        // Bind to MyService
        Intent i = new Intent(this, MyService.class);
        bindService(i, mConnection, Context.BIND_AUTO_CREATE) 
    }

Trong hàm onStop() : Ngắt kết nối đến MyService
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        //Unbind from Service
        if(mBound){
            mService.unbindService(mConnection);
            mBound = false ;
           
        }
    }

Tạo 1 biến mConnection từ lớp ServiceConnection nhằm Overide 2 phương thức sau nhằm bound đến MyService.
private ServiceConnection mConnection = new ServiceConnection() {
       
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBound = false;
        }
       
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // Bound to MyService.
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
    };;;

Cuối cùng trong phương thức onClick của button ta gọi đến hàm cong2so(int,int) và hiển thị kết quả của phương thức ra 1 textview như sau :
@Override
    public void onClick(View v) {
        if(v.getId() == R.id.button){
            if(mBound){
                int result = mService.cong2So(5, 5);
                tv.setText(new String().valueOf(result));
            }
        }
    }

Trong Android manifesh.xml thêm dòng này :  <service android:name="MyService"></service> trong thẻ <application>

file main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>



23 thg 5, 2012

Souce code client server trên Android qua tcp socket programing

Mục tiêu :
- Demo cách thức hoạt động của client server qua giao thức TCP.
- Gửi nhận dữ liệu giữa Server và Client.
- Xây dựng các ứng dụng client/server trên các thiết bị chạy android độc lập, không phụ thuộc vào pc.

Ý tưởng :
- Gửi dữ liệu từ client lên server.
- Hiển thị dữ liệu ra editText.
- Thông báo toast notification khi dữ liệu được gửi đến.

Cần biết :
- Socket và SocketServer.
- Toast Notification.
- Telnet Client.

 Code :
- Cài đặt dịch vụ telnet client trên máy tính.
- Khởi động 2 máy ảo emulator.
- Vào cdm gõ lệnh sau : telnet localhost 5554 .
- Tiếp tục gõ lệnh :  redir add tcp:9999:999 để cấu hình ánh xạ port giữa local port và server port cho máy ảo 5554 qua port 9999.

Làm đúng sẽ có hình như sau :

Bây giờ chúng ta chạy ứng dụng server trên máy ảo 5554, client trên máy ảo 5556.
Kết nối giữa client và server qua port 9999 và ip : 10.0.2.2 . 

Thực hiện đúng chúng ta sẽ có hình minh họa sau : 

 
 Bên trái là server, bên phải là client. Chú ý các phần được bôi khung vàng. Chúc vui.









14 thg 5, 2012

QuickAction UI Android


Hiện thực được QuickAction UI chúng ta sẽ có hình như sau :
Bài này mình kham khảo từ trang web sau : http://www.edumobile.org/android/android-apps/quick-action-demo/ 


Sourcode Code được cung cấp bởi trang web đó. 
Nếu bạn nào có thắc mắc điều gì, thì để lại comment mình sẽ giải thích nếu có thể.
Bạn nào muốn lấy source code thì để lại email nhé. Chúc vui. 
QuickAction là 1 UI Control không có sẵn trong Android SDK nhé. 

Một loại hiển thị khác của QuickAction 3D.


Một số phương thức vẽ các hình thông dụng


Khi nhấp vào các button thì ứng dụng sẽ vẽ các hình trên các View.
Thứ tự như sau :






Source code ứng dụng :   http://and-sungha-blog.googlecode.com/files/Draw.rar

Multi Choice ListView

Cách sử dụng ListView với nhiều sự lựa chọn. Sử dụng với layout ListView đã được hỗ trợ sẵn.
Các bạn hoàn toàn có thể custom lại ListView với nhiều sự lựa chọn tùy vào ngữ cảnh của ứng dụng.
Dễ dàng nhất là chúng ta sử dụng các tài nguyên đã được xây dựng sẵn.

Code :

public class MutilChoiseListViewActivity extends Activity {
    private ListView choiceLV;
    private String[] choice = { "String A", "String B", "String C", "String D" };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        choiceLV = (ListView) findViewById(R.id.list);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_multiple_choice, choice);
        choiceLV.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        choiceLV.setAdapter(adapter);
       

    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</LinearLayout>

Bản beta đầu tiên

Sau 6 tháng cả team cặm cụi làm việc điên cuồng, bản alpha cũng được giới thiệu ra toàn bộ công ty và được testing nội bộ công ty mà thôi. ...