@manhng

Welcome to my blog!

Developer (Dev) và Business Analyst (BA)

December 2, 2019 22:30

Developer (Dev) và Business Analyst (BA) (edit)

http://www.bacs.vn/vi/blog/nghe-nghiep/developer-dev-va-business-analyst-ba-ai-se-la-nguoi-chien-thang-1557.html

Developer (Dev) tin vào công nghệ như một tín đồ.
Tìm kiếm giải pháp tối ưu cho khách hàng là nhiệm vụ của BA (Business Analyst).
Họ làm việc trong cùng một team, chung tay sáng tạo cùng một sản phẩm.
Liệu chiến tranh sẽ xảy ra? Nếu có, ai là người chiến thắng?

Tình huống 1: DEVELOPER CẢM THẤY CHỨC NĂNG MỚI KHÔNG THUYẾT PHỤC!

DUY: “Thuyết phục” nên hiểu theo nghĩa là “chủ động tìm hiểu”, developer cũng có trách nhiệm phải chủ động hiểu nhu cầu của khách hàng (thông qua trợ giúp của BA), và tư vấn những giải pháp thích hợp nếu cần thiết. Để hiểu được vấn đề và mong muốn của khách hàng, một trong những cách tiếp cận là thu thập phản hồi của khách hàng sớm và thường xuyên về tính năng chúng ta đang xây dựng (thông qua wireframe, mockup, workflow, user stories, v.v..). BA thường đảm nhận vai trò này, và làm việc chung vói nhóm phát triển. Nếu gặp phải chức năng nào đó lớn, với kinh nghiệm của Duy, BA có thể chia nhỏ scope ra, thành từng user stories nhỏ hơn cho nhiều Sprints. Như vậy developer và những bên liên quan có thể có chung cái nhìn về kết quả dễ dàng hơn (giống như làm 1 đại lộ thì sẽ được thi công thành nhiều phân đoạn và được bàn giao khi mỗi phân đoạn hoàn thành)."
 
LINH: “Có lẽ nhiều BA sẽ chọn cách giải quyết: “Okay, developers thấy không thuyết phục nhưng khách hàng muốn như vậy, và chúng ta phải làm theo” – Tiếp cận này chưa đủ thuyết phục, và đây không hẳn là giải pháp, đây là một sự áp đặt. Với tình huống này, theo Linh, BA nên chủ động tìm hiểu và so sánh các ứng dụng trên thị trường có chức năng tương tự, và sau đó quay lại chia sẻ và thảo luận với development team. Làm như vậy, nghĩa là chúng ta đang tìm kiếm sự đồng thuận và tiếng nói chung giữa 2 bên để có được kết quả tốt hơn. Bên cạnh đó, các bạn BA lại có thêm một kiến thức mới đấy! Một khía cạnh khác, biết đâu trong quá trình tìm hiểu kỹ hơn đó, BA sẽ nhận ra điều mà developer thấy không thuyết phục là chính xác? Cũng từ đó chúng ta sẽ có cách giải quyết khác và cùng tư vấn cho khách hàng.”
 

Tình huống 2: HIỂU LẦM YÊU CẦU, PHÁT HIỆN VÀO GIAI ĐOẠN CUỐI, NHƯ UAT

LINH:
 
“Lỗi không thuộc về cá nhân nào cả, lỗi là của cả team. Dự án có vấn đề là do team có vấn đề.
 
Trong tình huống này, tất cả team member nên ngồi lại với nhau, không phải để quy trách nhiệm cho ai, mà để tìm cách giải quyết. Quan trọng là cùng nhau triển khai dự án thành công và đáp ứng nhu cầu của khách hàng.
 
Theo kinh nghiệm của mình, nếu đúng là do bên mình hiểu sai vấn đề, chúng ta nên thẳng thắng nhận lỗi, sau đó những người key members của dự án nên làm việc trực tiếp với khách hàng, đưa ra kế hoạch thời gian cụ thể để sửa chữa những lỗi đó.
 
Trường hợp không may nhất là rơi ngay vào bản release cuối cùng, trước khi bàn giao chính thức toàn bộ cho khách hàng… Lúc này nên nghĩ đến bản vá lỗi, đương nhiên mọi vấn đề cần có sự tham gia và quyết định từ phía khách hang. Triển khai bản vá lỗi cũng là giải pháp mà nhiều tập đoàn lớn vẫn áp dụng. Không có gì là hoàn hảo và trọn vẹn ngay từ đầu được!”
 
DUY:
“Mình chưa có kinh nghiệm trong tình huống này. Tuy nhiên, trong các dự án Duy đã tham gia, một trong những quy tắc nhóm của Duy luôn làm theo là: các user stories sẽ được bàn giao ngay khi hoàn thành để khách hàng xem ngay, để cho mình có thời gian chỉnh sửa nếu cần.
 
Duy cũng thấy vấn đề này thường xảy ra ở những dự án dạng phải nâng cấp một hệ thống cũ lên công nghệ mới. Và các nhóm dự án đó vô hình đi vào lối mòn: thời gian cho BA làm việc (phân tích, nghiên cứu, thảo luận, v.v..) khá ngắn trong khi tiến độ thi công tính năng lại cần phải nhanh chóng."

Tình huống 3: LIỆU CHỨC NĂNG NÀY CÓ LÀM ĐƯỢC KHÔNG? KHÁCH HÀNG CÓ CẦN KHÔNG?

DUY: 
“Tình huống này làm Duy nhớ đến một sai lầm mà developer hay mắc phải khi làm outsourcing: YAGNI (You aren’t gonna need it) và hiệu ứng quả cầu tuyết. Trong quá trình thi công một tính năng nào đó, để ngăn ngừa những thay đổi không lường trước mà có khả năng ảnh hưởng đến tiến độ: bất kì thay đổi nào cũng phải được thông báo ngay trước khi bắt tay thực hiện.
 
Chuyện thực tế Duy từng mắc phải: khi làm việc trên một form đăng ký cho một website quản lý hệ thống bệnh viện (khách hàng Mỹ), mình đã thêm trường Year vào phần giao diện nhập ngày tháng. Nhưng cuối cùng khách hàng không muốn có nó vì trường Year làm chậm thời gian nhập dữ liệu của họ.”
 
LINH: “Có thể có ba trường hợp:
 
1. Developer nói requirements không khả thi về mặt kỹ thuật. Trong trường hợp này, BA nên chủ động nghiên cứu về hướng tiếp cận kỹ thuật cho yêu cầu đó, không cần quá chi tiết nhưng BA nên biết chắc rằng có phải yêu cầu đó “không thật sự khả thi”. Đây cũng là một cách để BA nâng cao kiến thức của mình.
 
2. BA đưa requirement nằm trong giới hạn kỹ thuật: BA cùng với developer nên cùng nhau tìm hiểu và đề xuất giải pháp – thoả mãn cả về yêu cầu khách hàng và vấn đề kỹ thuật.
 
3. Nếu vượt ngoài tầm kiểm soát của BA: Hãy để bên thứ 3 tham gia cùng giải quyết vấn đề. Ví dụ như chia sẻ điều này cho người quản lý dự án chẳng hạn.”
 

Tình huống 4: BẢN MÔ TẢ YÊU CẦU CỦA BA NHƯ THẾ NÀO ĐƯỢC GỌI LÀ CHI TIẾT?

 
DUY: “Theo cá nhân mình, bản mô tả tính năng (trên bất kì định dạng nào như word, wireframe, video…) ở mức độ chi tiết và chất lượng tốt khi nhóm phát triển có thể đưa ra ước lượng thời gian hoàn thành (một cách tự tin). Nếu có quá nhiều thắc mắc sau khi developer đọc bản mô tả, thì tức là nó cần chi tiết hơn nữa.”
 
LINH: “Developer đọc hiểu và code đúng (đương nhiên sẽ có bug, nhưng là bug về technical chứ không phải bug vì hiểu sai yêu cầu khách hàng). QC có thể tạo ra test case bao phủ hết được các phân luồng trong yêu cầu khách hàng. Nếu có tranh cãi về mức độ chi tiết của thông tin, hãy tổ chức một buổi meeting, duyệt qua toàn bộ tài liệu, từ tổng quát đến từng phần chi tiết. Đoạn nào developer còn khúc mắc, BA bổ sung. Qua việc làm đó, team sẽ tránh được những trường hợp phát sinh. Bên cạnh đó, BA sẽ có thêm kinh nghiệm, biết cách tiếp cận và cải thiện sau này.”
 

Tình huống 5: TẠI SAO YÊU CẦU BỊ THAY ĐỔI (CHANGE REQUEST) QUÁ NHIỀU?

 
LINH: “Một là do kỹ năng BA chưa đủ cứng. Nếu cách approach và mức độ mô tả của BA đủ bao quát hết trường hợp, sẽ không xảy ra nhiều thay đổi yêu cầu trong quá trình phát triển sản phẩm. Vấn đề này, hãy nói chuyện với leader của bạn và tìm ra cách để hoàn thiện mình hơn. Hai là do từ phía khách hàng, BA có trách nhiệm thống nhất rõ với khách hàng, hiểu rõ lý do thay đổi và cập nhật, sau đó giải thích với development team.
 
Trong một dự án lớn, thời gian phát triển khoảng 5,6 tháng, mình thấy trên 30% thay đổi sẽ đến từ phía khách hàng, nếu cao hơn thì có lẽ khách hàng cũng đang có vấn đề từ phía họ.”
 
DUY: “Nếu một chức năng trong quá trính phân tích (chưa thi công), mà không được các bên dành nhiều thời gian để xem xét / kiểm tra kỹ lưỡng, thì những trường hợp phát sinh khi thi công và change request là chuyện đương nhiên. Theo mình, một chức năng nhỏ (khoảng 4 man-day) thường cần khoảng 3 vòng review (một vòng = gửi và nhận feedback)."
 
VẬY, AI LÀ NGƯỜI CHIẾN THẮNG?
 
Có thể những kiến thức này bạn đã biết, và cả những tình huống bạn chưa từng trải qua… Bạn có cùng quan điểm với những giải pháp, cách lý luận giống như các speakers ngày hôm nay?
 
Trong cuộc đối thoại, developer có chính kiến của riêng mình, BA có cách giải quyết theo họ là hợp lý. Làm việc trong cùng một team, chắc chắn không thể tránh khỏi “chiến tranh”.
 
Kết quả của cuộc chiến, chúng ta sẽ có gì?
 
>> Một sản phẩm đáp ứng được tất cả yêu cầu và thoả thuận ban đầu với khách hàng.
 
>> Khi đến tay end-user, họ cảm thấy hài lòng khi sử dụng và đánh giá tốt, cùng những comment tích cực.
 
Vậy bạn biết ai là người chiến thắng rồi đấy!

Dev

December 13, 2017 11:31

Tự ôn tập phỏng vấn về lập trình (Coding Interview University)

https://github.com/jwasham/coding-interview-university/blob/master/translations/README-vi.md

Tree to List in JavaScript

https://danmartensen.svbtle.com/converting-a-tree-to-a-list-in-javascript

function convertTreeToList(root) {

    var stack = [], array = [], hashMap = {};

    stack.push(root);

    while(stack.length !== 0) {

        var node = stack.pop();

        if(node.children === null) {

            visitNode(node, hashMap, array);

        } else {

            for(var i = node.children.length - 1; i >= 0; i--) {

                stack.push(node.children[i]);

            }

        }

    }

    return array;

}

 

function visitNode(node, hashMap, array) {

    if(!hashMap[node.data]) {

        hashMap[node.data] = true;

        array.push(node);

    }

}

 

var tree = {

  "data": null,

  "children": [

    {

      "data": "A",

      "children": null

    },

    {

      "data": "B",

      "children": null

    },

    {

      "data": null,

      "children": [

        {

          "data": "C",

          "children": null

        },

        {

          "data": "D",

          "children": null

        },

        {

          "data": "A",

          "children": null

        }

      ]

    }

  ]

}

 

// intial tree has leaf nodes A, B, C, D, A

console.log(tree);

 

// do conversion

var array = convertTreeToList(tree);

 

// converts to list of A, B, C, D

// removes duplicates and preserves order

console.log(array);

JavaScript Type Checking

https://danmartensen.svbtle.com/type-checking-techniques-in-javascript-part-1

https://danmartensen.svbtle.com/type-checking-techniques-in-javascript-part-2

Map, Filter & Reduce

https://code.tutsplus.com/tutorials/how-to-use-map-filter-reduce-in-javascript--cms-26209

http://cryto.net/~joepie91/blog/2015/05/04/functional-programming-in-javascript-map-filter-reduce/

https://danmartensen.svbtle.com/javascripts-map-reduce-and-filter

var tasks = [
{
'name' : 'Write for Envato Tuts+',
'duration' : 120
},
{
'name' : 'Work out',
'duration' : 60
},
{
'name' : 'Procrastinate on Duolingo',
'duration' : 240
}
];

var task_names = [];
for (var i = 0, max = tasks.length; i < max; i += 1) {
task_names.push(tasks[i].name);
}

var task_names = [];
tasks.forEach(function (task) {
task_names.push(task.name);
});

var task_names = tasks.map(function (task, index, array) {
return task.name;
});

var task_names = tasks.map((task) => task.name );

----------
var map = function (array, callback) {
var new_array = [];
array.forEach(function (element, index, array) {
new_array.push(callback(element));
});
return new_array;
};

var task_names = map(tasks, function (task) {
return task.name;
});

Cache

http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/

Chrome tools

https://viblo.asia/p/mot-so-chrome-extensions-huu-ich-danh-cho-viec-test-web-apps-GrLZD9vElk0

https://viblo.asia/p/top-chrome-extensions-danh-cho-viec-test-web-apps-ZjlvawjneqJ

Paging HTML using JavaScript

http://dotnet-munesh.blogspot.in/2016/08/paging-in-html-table-using-javascript.html

JavaScript frameworks

https://www.infoworld.com/article/3229747/javascript/the-10-essential-tools-for-javascript-developers.html

All the C# versions

http://dotnetcrunch.com/list-of-c-new-features-by-version/

Exception

  1. Syntactical Error
  2. Compilation Error
  3. Runtime Error
    1. Argument Exception
    2. ArgumentNullException
    3. ArithmeticException
    4. IndexOutOfRange
    5. NullReferenceException
    6. InSufficientException
    7. and others

Object-oriented Programming in C# for C and Java programmers

http://people.cs.aau.dk/~normark/oop-csharp/html/notes/theme-index.html

The System.Collections namespace includes following non-generic collections.

  1. ArrayList
  2. SortedList
  3. Hashtable
  4. BitArray
  5. Stack
  6. Queue

Read more http://dotnetcrunch.com/what-are-non-generic-collections-in-c/

The System.Collections.Genrics namespace includes following generic collections.

  1. List<T>
  2. SortedList<TKey, TValue>
  3. Hashset<T>
  4. Dictionary<Tkey, TValue>
  5. Stack<T>
  6. Queue<T>

Read more http://dotnetcrunch.com/generic-collections-c-example/

Differences between cookies and sessions?

http://www.devshed.com/c/a/PHP/Sessions-and-Cookies/

Sessions are server-side files that contain user information, while Cookies are client-side files that contain user information. Sessions have a unique identifier that maps them to specific users. This identifier can be passed in the URL or saved into a session cookie.

Most modern sites use the second approach, saving the identifier in a Cookie instead of passing it in a URL (which poses a security risk). You are probably using this approach without knowing it, and by deleting the cookies you effectively erase their matching sessions as you remove the unique session identifier contained in the cookies.

Cookies và một số vấn đề bảo mật

https://whitehat.vn/threads/web12-http-cookie-va-mot-so-van-de-bao-mat-phan-1.1948/

Cookies và Session trong ASP.NET

https://anhthienad.com/blog/so-sanh-cookie-va-session-trong-asp-net.html

  • Địa chỉ URL của website mà trình duyệt nhận cookie
  • Thời gian tồn tại của Cookie
  • Giá trị lưu trữ

Cookies trong ASP.NET

  • Name: Tên Cookie.
  • Domain: Tên miền của Cookie lưu trữ.
  • Expires: Xác định thời gian hiệu lực của Cookie.
  • Value: Giá trị của Cookie.
  • HasKeys: Cho biết Cookie có tập giá trị con hay không.
  • Values: Tập các giá trị của Cookie.

Những câu hỏi thường gặp:

- Introduce yourself and your experiences
- Decrible lastest projects: role, module implemented
- Compare Winform vs Webform
- C# :
   + Abstract class vs Interface. When use ?
   + Allow multi inheritance or not ?
   + Singleton vs Static Class
   + Delegate
   + Threadsafe: What is it? Purpose ?
   + Hashtable: Define and How to add item to hashtable
   + Aggregation vs composition
- SQL
   + Rate yourself from 1 to 10 ?
   + Cluster Index vs Non-clusterIndex
   + Table variable vs temp table
   + Write a query with group by having (Renga will give the requirement) 

Củng cố lại các phần sau:

- Basic T-SQL Statements (SELECT/ UPDATE/ INSERT/ DELETE …)
- JOIN clauses (INNER JOIN/ FULL JOIN/ LEFT JOIN/ RIGHT JOIN/ CROSS JOIN)
- Aggregation functions (COUNT/ MAX …)
- EXIST operator/ IN
- Date functions (DATEADD/ DATEDIFF …)
- Ranking functions (PARTITION BY …OVER/ ROW_NUMBER() …)
- Temporary table, variable table, using cursor.
- CASE… WHEN clause
- Advanced subjects (nice to have): PIVOT/ UNPIVOT/ Performance tuning/ CTE …
- Design patterns, WPF, Dependency Injection (Unity framework)

Categories

Recent posts