Bài 5 – Android: hướng dẫn load dữ liệu từ resource

Resources là gì?

  • Là các tệp và nội dung tĩnh được tải trực tiếp vào package: bitmaps, layouts, strings, themes , styles, animations…
  • Đặt resources trong các thư mục con nằm trong thư mục res
  • Truy cập tới resources thông qua IDs của nó

Cách load resource thông qua code

// Read data directly from resource CharSequence[] productBasePrices; Resources res = getResources();
// base_prices is array of string which defined in strings.xml productBasePrices = res.getTextArray(R.array.base_prices);

Các phương thức để load Resources object:

  • getBoolean() // lấy resource kiểu boolean
  • getDrawable() // lấy resource kiểu drawable (images)
  • getInteger() // lấy resource kiểu int
  • getText() // lấy resource kiểu string
  • getTextArray() // lấy resource kiểu array

Trong ví dụ sau đây tôi sẽ hướng dẫn mọi người thực hiện theo kịch bản

  • Danh sách product gồm: tên, giá, mô tả… được lưu trên resources
  • Load lên và hiển thị danh sách tên product ở tab Catalog

Bước 1: thêm vào trong res/values/strings.xml các string-array sau (nằm trong thẻ

  • Các category của product

 

<string-array name="product_category_options">
    <item>Saws</item>
    <item>Wrenches</item>
    <item>Pliers</item>
    <item>Hammers</item>
    <item>Screwdrivers</item>
    <item>Files and Chisels</item>
    <item>Planers</item>
    <item>Measuring Tools</item>
    <item>Miscellaneous</item>
</string-array>
  • Danh sách product
<string-array name="product_names">
    <item>Chainsaw</item>
    <item>Circular Saw</item>
    <item>Hacksaw</item>
    <item>Hand Saw</item>
    <item>Jigsaw</item>
    <item>Adjustable Wrench</item>
    <item>Open-End Wrench</item>
    <item>Pipe Wrench</item>
    <item>Combination Pliers</item>
    <item>Crimping Pliers</item>
    <item>Diagonal Pliers</item>
    <item>Tongue-and-Groove Pliers</item>
    <item>Machinist\'s Hammer</item>
    <item>Claw Hammer</item>
    <item>Rubber Mallet</item>
    <item>Flat-Head Screwdriver (Large)</item>
    <item>Flat-Head Screwdriver (Small)</item>
    <item>Phillips-Head Screwdriver (Large)</item>
    <item>Phillips-Head Screwdriver (Small)</item>
    <item>Flat File</item>
    <item>Round File</item>
    <item>Hand Chisel</item>
    <item>Power Chisel</item>
    <item>Hand Planer</item>
    <item>Power Planer</item>
    <item>Level</item>
    <item>Square</item>
    <item>Tape Measure</item>
    <item>Hand Axe</item>
    <item>Drill</item>
    <item>Gloves</item>
    <item>Paint Roller</item>
    <item>Scissors</item>
    <item>Toolbox</item>
    <item>Utility Knife</item>
</string-array>
  • Danh sách mapping product với category nào
<string-array name="product_categories">
    <item>Saws</item>
    <item>Saws</item>
    <item>Saws</item>
    <item>Saws</item>
    <item>Saws</item>
    <item>Wrenches</item>
    <item>Wrenches</item>
    <item>Wrenches</item>
    <item>Pliers</item>
    <item>Pliers</item>
    <item>Pliers</item>
    <item>Pliers</item>
    <item>Hammers</item>
    <item>Hammers</item>
    <item>Hammers</item>
    <item>Screwdrivers</item>
    <item>Screwdrivers</item>
    <item>Screwdrivers</item>
    <item>Screwdrivers</item>
    <item>Files and Chisels</item>
    <item>Files and Chisels</item>
    <item>Files and Chisels</item>
    <item>Files and Chisels</item>
    <item>Planers</item>
    <item>Planers</item>
    <item>Measuring Tools</item>
    <item>Measuring Tools</item>
    <item>Measuring Tools</item>
    <item>Miscellaneous</item>
    <item>Miscellaneous</item>
    <item>Miscellaneous</item>
    <item>Miscellaneous</item>
    <item>Miscellaneous</item>
    <item>Miscellaneous</item>
    <item>Miscellaneous</item>
</string-array>
  • Danh sách images, description và price của product
<string-array name="product_images">
    <item>chainsaw</item>
    <item>circular_saw</item>
    <item>hacksaw</item>
    <item>hand_saw</item>
    <item>jigsaw</item>
    <item>adjustable_wrench</item>
    <item>open_end_wrench</item>
    <item>pipe_wrench</item>
    <item>combination_pliers</item>
    <item>crimping_pliers</item>
    <item>diagonal_pliers</item>
    <item>tongue_and_groove_pliers</item>
    <item>machinists_hammer</item>
    <item>claw_hammer</item>
    <item>rubber_mallet</item>
    <item>screwdriver_flat_lg</item>
    <item>screwdriver_flat_sm</item>
    <item>screwdriver_phillips_lg</item>
    <item>screwdriver_phillips_sm</item>
    <item>flat_file</item>
    <item>round_file</item>
    <item>hand_chisel</item>
    <item>power_chisel</item>
    <item>hand_planer</item>
    <item>power_planer</item>
    <item>level</item>
    <item>square</item>
    <item>tape_measure</item>
    <item>axe</item>
    <item>drill</item>
    <item>gloves</item>
    <item>paint_roller</item>
    <item>scissors</item>
    <item>toolbox</item>
    <item>utility_knife</item>
</string-array>

<string-array name="product_descriptions">
    <item>This gas-powered chainsaw is perfect for limbing and other light-duty work. It features a 16\" steel guide bar and an automatic chain oiler. Its ergonomic design makes it easy to maneuver and comfortable to operate for extended periods of time.</item>
    <item>This lightweight 7-1/4\" circular saw makes wood cutting a breeze! The high-accuracy laser beam guide will keep your cuts straight and true, while the integrated dust blower will clear your cutting area of debris. Although designed to be compact, this saw features a powerful 5,000 RPM motor with a maximum of 2,000 watts output.</item>
    <item>This is the kind of precision hacksaw that every woodworker needs in their toolkit. The saw\'s 12\" steel blade is held at high tension, ensuring that your cuts are always on target. The handle grip makes operating the saw hassle free, while at the same time preventing your hand from slipping.</item>
    <item>This 15\" hand saw has been an old standby ever since it was introduced into our catalog decades ago. Recent modifications have increased its sharpness by a factor of 60%, giving you that much-needed edge without compromising its legendary durability. Like all of our handheld saws, this one features a handle grip that improves both comfort and safety.</item>
    <item>Our powered jigsaw is ideal for any woodworker who needs to cut precise straight lines. Adjusting speeds on-the-fly is simple\u2014the saw works for you, not the other way around! The frame is sturdy and enables you easily swap out new blades when needed.</item>
    <item>This is an 8\" wrench made of stainless steel that belongs in every home, not just woodworking enthusiasts. Its jaw width is easily adjustable and can grip a wide variety of nuts, bolts, and other fasteners.</item>
    <item>This double-ended wrench features a 5/16 x 3/8\" opening on one end, and a 7/16 x 1/2\" opening on the other. A chromium-vanadium steel alloy has made our wrenches the most durable on the market for years.</item>
    <item>This 14\" heavy-duty pipe wrench features carbon steel jaws and a strong iron handle. The adjustable jaws support a wide range of fastener sizes\u2014all the way up to 1-3/4\". Its unique teeth design guarantees a non-slip grip even on smooth surfaces.</item>
    <item>Our combination pliers are great for any job that requires cutting wires and cables. The teeth provide enough torque to cut through thick cable, and the needle nose tip is excellent for precision cuts. The pliers\' ergonomic design makes operating the tool easy and comfortable.</item>
    <item>When you need to fold a wire instead of cut it, our crimping pliers are the right tool for the job. The stainless steel jaws feature a unique teeth design that maximizes pivoting, enabling you to easily manage stranded wire.</item>
    <item>These ultra-sharp pliers are perfect for slicing right through wires made of copper, brass, steel, and more. Their lightweight and comfortable handle enables you to cut wires quickly without straining your hand.</item>
    <item>The adjustable jaws on these pliers are made of a carbon steel alloy that is tough and minimizes slippage. These pliers are perfect for applying torque to any number of fasteners, and excel at gripping irregularly shaped objects.</item>
    <item>This 12-ounce machinist\'s hammer is designed to absorb vibrations during impact, minimizing discomfort. The head is made of a carbon steel alloy and is perfect for working strong materials, while the rubber grip ensures that your hand will never slip during use.</item>
    <item>Our no-frills claw hammer has been a customer favorite ever since it was the first item to be put up for sale in our store decades ago. This 16-ounce hammer features a heat-treated stainless steel head and a shock-absorbing hardwood handle.</item>
    <item>This 16-ounce mallet features a solid rubber head that provides a durable, yet softened strike to any number of surfaces. The hardwood handle is designed to be held comfortably with one or two hands, and absorbs the shock of repeated and forceful strikes.</item>
    <item>This 3/16\" flat-head screwdriver features a long, narrow body for an improved reach. The blade is a stainless steel alloy with a hardened tip that will fit any flat-head screw, even ones that have been stripped. Its soft-grip handle will prevent slippage no matter how much pressure is applied.</item>
    <item>This 1/4\" flat-head screwdriver features a small, stubby body for easy maneuverability and portability. The blade is a stainless steel alloy with a hardened tip that will fit any flat-head screw, even ones that have been stripped. Its soft-grip handle will prevent slippage no matter how much pressure is applied.</item>
    <item>This #2 Phillips-head screwdriver features a long, narrow body for an improved reach. The blade is a stainless steel alloy with a hardened tip that will fit any Phillips-head screw, even ones that have been stripped. Its soft-grip handle will prevent slippage no matter how much pressure is applied.</item>
    <item>This #3 Phillips-head screwdriver features a small, stubby body for easy maneuverability and portability. The blade is a stainless steel alloy with a hardened tip that will fit any Phillips-head screw, even ones that have been stripped. Its soft-grip handle will prevent slippage no matter how much pressure is applied.</item>
    <item>This 6\" flat file is great for any job that requires removing fine amounts of wood, metal, and other surfaces. The blade is a carbon steel alloy with sharpened teeth for extra durability and dependability. Its fiberglass handle is contoured for maximum grip.</item>
    <item>This 6\" round file is great for any job that requires removing scalloped edges from wood, metal, and other surfaces. The blade is a carbon steel alloy with sharpened teeth for extra durability and dependability. Its fiberglass handle is contoured for maximum grip.</item>
    <item>Our hand chisel features an incredibly sharp carbon steel alloy that will retain its edge even in the most extreme circumstances. The blade itself is 1-1/4\" wide and 5-1/2\" long. The handle is a soft fiberglass that provides a sure grip and comfortable operation.</item>
    <item>This air-powered chisel is ideal for intense carving work that a hand chisel can\'t keep up with. The chromium-vanadium alloy blade is among our sharpest ever, cutting through even the most hardened of surfaces. This unit is rated at 12,500 cuts per minute, yet remains completely stable throughout operation.</item>
    <item>Our adjustable hand planer features an ultra-sharp 2\" cutter, perfect for stripping and shaping any type of wood. The cutter is tempered for increased durability, lasting years even with heavy usage. For precise control, the cutter can be easily adjusted for both alignment and depth.</item>
    <item>Our powered planer is a precision machine that can smooth any wooden surface quickly and easily. It has a speed of 17,000 RPMs and features a 6 amp motor. Depth adjustment and alignment are simple with the calibration knob.</item>
    <item>This level guarantees a high degree of accuracy when straight lines are a must. The horizontal, vertical, and diagonal bubbles are fine-tuned to maximize their sensitivity. The body is a non-abrasive aluminum that won\'t damage even the softest of woods or other surfaces.</item>
    <item>This square features a 11\" blade made of hardened wood and a 7\" tongue made of stainless steel. It is ideal for working with straight edges, but the blade also features an inch and centimeter ruler for accurate measurement.</item>
    <item>This 30\' tape measure includes a 1-1/4\" tape rule with metal clip. The locking mechanism ensures that the tape rule remains steady even when exposed to vigorous movement. The tempered spring supports a smooth, gradual recoil action.</item>
    <item>This 14\" axe is perfect for light-duty wood chopping. It features an ultra-sharp tempered steel edge that won\'t dull under continued use. The handle is a comfortable, grip-resistant fiberglass material designed to absorb impact vibrations.</item>
    <item>Our cordless drill features an adjustable RPM range up to 1,500, ensuring that the right amount of force is applied to the situation. Its ergonomic design and lightweight frame helps to maximize user comfort while minimizing strain. Comes with two USB-rechargeable batteries.</item>
    <item>These work gloves are made from an ultra-grip nylon polymer that is resistant to tears, punctures, and other damage. The inside is soft, comfortable, and keeps the hand cooled with room to breathe. One size fits all.</item>
    <item>This 9\" paint roller package comes with both frame and cover. The heavy-duty frame is a 6-wire design that ensures smooth, yet sturdy application on any surface. At the bottom of the frame is a threaded grip to accommodate an extension pole. The included cover is made of a consistent polyester.</item>
    <item>These 8\" titanium-bonded heavy-duty scissors can easily cut through upholstery, thick rubber, and many other tough materials. The handle is designed to accommodate any size and shape of fingers without losing its grip.</item>
    <item>This 16\" portable toolbox is made of a lightweight plastic polymer that keeps the inside of the box insulated from debris and water leakage. The handle makes toting the toolbox with one hand easy, and the steel latches and hinges keep it secure. Inside of the toolbox is a removable tray to help keep tools organized.</item>
    <item>This retractable utility knife features a sharp carbon steel blade that is great for cutting drywall, thin strips of wood, and much more. The blade is housed in the handle when not in use, and is easy to extend when needed. The nose has an interlocking mechanism for keeping the blade secure.</item>
</string-array>

<string-array name="product_prices">
    <item>$105.95</item>
    <item>$74.99</item>
    <item>$19.99</item>
    <item>$17.75</item>
    <item>$89.95</item>
    <item>$9.95</item>
    <item>$4.45</item>
    <item>$17.75</item>
    <item>$22.25</item>
    <item>$11.95</item>
    <item>$8.85</item>
    <item>$14.45</item>
    <item>$9.95</item>
    <item>$8.49</item>
    <item>$6.99</item>
    <item>$1.99</item>
    <item>$1.25</item>
    <item>$1.99</item>
    <item>$1.25</item>
    <item>$3.55</item>
    <item>$3.55</item>
    <item>$10.99</item>
    <item>$145.55</item>
    <item>$31.99</item>
    <item>$160.55</item>
    <item>$5.25</item>
    <item>$7.75</item>
    <item>$8.99</item>
    <item>$20.99</item>
    <item>$80.15</item>
    <item>$6.65</item>
    <item>$12.25</item>
    <item>$9.95</item>
    <item>$26.99</item>
    <item>$9.95</item>
</string-array>
  • Giao diện của tab Catalog đơn giản chỉ chứa một list view để load dữ liệu danh sách product lên
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ourcompany.catalog.CatalogFragment">

    <!-- TODO: Update blank fragment layout -->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/productList"
        android:layout_gravity="center_vertical|top">

    </ListView>

</FrameLayout>
  • Bước tiếp theo chúng ta viết code để đọc dữ liệu từ strings.xml resource lên và nạp vào list view. Khai báo các biến trong class CatalogFragment để chứa dữ liệu
// Parallel arrays to hold prouct data for quick lookup
CharSequence[] productNames;
CharSequence[] productDescriptions;
CharSequence[] productCategories;
CharSequence[] productPrices;
CharSequence[] productImages;
  • Trong hàm onCreateView của CatalogFragment, thực hiện load dữ liệu từ strings resource lên
// Get Product data from resources
Resources res = getResources();
productNames = res.getStringArray(R.array.product_names);
productCategories = res.getStringArray(R.array.product_categories);
productDescriptions = res.getStringArray(R.array.product_descriptions);
productPrices = res.getStringArray(R.array.product_prices);
productImages = res.getStringArray(R.array.product_images);
  • Sau khi load dữ liệu, chúng ta tham chiếu lại list view và đưa dữ liệu vào list view bằng cách tạo một ArrayAdapter cho nó.
// Reference to ListView
ListView productListView = (ListView) view.findViewById(R.id.productList);

ArrayAdapter<CharSequence> productListAdapter = ArrayAdapter.createFromResource(view.getContext(),
        R.array.product_names, android.R.layout.simple_list_item_1);
productListView.setAdapter(productListAdapter);
  • Ở ví dụ này để cho đơn giản tôi chỉ lựa chọn xây dựng ArrayAdapter là mảng chuỗi, và lựa chọn layout cho các phần tử trên list dạng mặc định simple_list_item_1.
  • Các bạn build và chạy thử chương trình thành công sẽ load lên tab Catalog của ứng dụng danh sách các product

Chúc các bạn thành công!

Kỹ năng huấn luyện và đánh giá nhân viên

Nội dung

  • Huấn luyện và kèm cặp nhân viên
    • Huấn luyện là gì?
    • Tại sao phải huấn luyện?
    • Quytrình huấn luyện
    • Cácphương pháp huấn luyện
    • Trở thành người huấn luyện hiệu quả
  • Đánh giá nhân viên
    • Tầm quan trọng của việc đánh giá đúng nhân viên
    • Quy trình đánh giá nhân viên

Qua bài chia sẻ này các bạn sẽ học hỏi được:

  • Nắm vững được một số kiến thức cơ bản về Huấn luyện và kèm cặp
  • Học hỏi được một số kỹ năng quan trọng về Huấn luyện và kèm cặp
  • Tự tin hơn trong công tác đào tạo và phát triển nhân viên
  • Nắm vững tầm quan trọng và quy trình đánh giá nhân viên

coaching

I. HUẤN LUYỆN NHÂN VIÊN

  1. Huấn luyện là gì?

    • “Huấn luyện là một hoặc nhiều phương pháp để cải tiến cách thức, hình thành thói quen làm việc mới của những người khác.”
    • Định nghĩa khác: “Huấn luyện là một quy trình có tính chất tương tác và thông qua đó các nhà quản lý và giám sát sẽ giải quyết vấn đề về năng lực thực hiện và phát triển khả năng của nhân viên.”
  2. Tại sao phải huấn luyện?

    • Khắc phục các vấn đề về năng lực thực hiện
    • Giúp nhân viên có năng suất cao hơn
    • Giải phóng thời gian của quản lý
    • Quản lý có thể quản lý nhóm nhiều nhân viên hơn
    • Quản lý có thể dành thời gian cải tiến, phát triển các kinh nghiệm, kỹ năng trong công việc chung
    • Tạo ra năng suất chung của bộ phận ngày càng cao hơn
    • Nuôi dưỡng một môi trường văn hóa làm việc tích cực
    • whycoaching
  3. Quy trình huấn luyện?

    • Screen Shot 2018-07-02 at 3.31.52 PM
  4. Bước 1: Chuẩn bị

    • Quan sát để hiểu rõ tình huống, bản thân nhân viên và các kỹ năng hiện tại của người đó.
    • Xác định điểm mạnh và điểm yếu của nhân viên
    • Quan sát hành vi của nhân viên theo cách không chính thức (quan sát trong khi họp,..) lẫn chính thức ( như khi pair coding,…) để phát hiện nhân viên thực hiện tốt/không tốt điều gì
    • Tránh phán xét vội vàng
    • Lắng nghe chủ động 
    • Nếu nhân viên yêu cầu giúp đỡ, bạn nên cư xử như thế nào? hãy khơi gợi bằng cách hỏi: “Phần nào trong công việc của anh khiến anh thấy rắc rối nhất?”.
    • Yêu cầu nhân viên chuẩn bị bằng cách để nhân viên đó tự đánh giá năng lực thực hiện công việc của mình. Việc tự đánh giá của nhân viên đem lại hai lợi ích: Lôi kéo nhân viên tham gia vào quy trình huấn luyện. Đem lại cho nhà quản lý một quan điểm nhìn nhận khác về công việc của cấp dưới cũng như các vấn đề liên quan
  5. Bước 2: Thảo luận

    • Chuẩn bị rõ ràng về mục đích thảo luận
    • Sẵn sàng đối thoại chia sẻ các chiến lược để khắc phục những vấn đề về năng lực thực hiện và xây dựng các kỹ năng.
    • Tập trung vào cách hành xử thay vì thái độ
    • Đặt câu hỏi thăm dò để hiểu người đối thoại
    • Câu hỏi đóng “Có” hoặc “Không” để nhấn mạnh câu trả lời, khẳng định lại những gì người kia đã nói, duy trì sự nhất trí của 2 bên
    • Câu hỏi mở để tìm giải pháp, khám phá thái độ, động cơ
    • “Anh đã thử chưa?”

      “Anh nghĩ cách tốt nhất để là gì?”

      “Anh nghĩ điều gì sẽ xảy ra nếu anh ?”

      “Vậy là anh đã thử và kết quả thật đáng thất vọng. Anh có giả định gì về sự việc đó không?”

      “Tôi để ý thấy anh hiếm khi chia sẻ quan điểm của mình trong các cuộc họp nhóm. Tại sao vậy?”

    • Tạo bầu không khí thoải mái
    • Lắng nghe những cảm xúc ẩn sau lời nói
    • Gạt bỏ thành kiến
    • Đưa ra kế hoạch huấn luyện được thống nhất cả người huấn luyện và người được huấn luyện
    • Nhân viên chấp nhận thay đổi khi họ hiểu được hậu quả từ hành vi và công việc của họ
    • Khuyến khích nhân viên bày tỏ điểm bất đồng
  6. Bước 3: Huấn luyện

    • Cấu trúc huấn luyện bao gồm: ĐỊNH NGHĨA (Xác định mục tiêu làm việc) ->  PHÂN TÍCH (Hiểu rõ tình trạng hiện thời) -> KHÁM PHÁ (Tìm ra cách thức đi tới mục tiêu đề ra ) -> HÀNH ĐỘNG (Xác định thời gian hoàn thành mục tiêu) -> HỌC HỎI (Thực thi những gì đã thống nhất ) -> PHẢN HỒI (Kiểm tra lại toàn bộ quá trình trong buổi huấn luyện kế tiếp ).
    • Quá trình huấn luyện: Huấn luyện là một quá trình không có điểm dừng – mỗi một thành công sẽ là nền tảng cho thách thức mới. Tuy nhiên khi huấn luyện phải luôn chú ý tới quá trình 6 bước ở trên để đi tới đích.
    • Một số lưu ý:

      -Đạt được sự nhất trí về mục tiêu

      -Đảm bảo nhân viên thấy được lợi ích rõ ràng trong các mục tiêu huấn luyện

      -Nhân viên nên được tạo cơ hội để soạn thảo một kế hoạch nhằm khắc phục những nhược điểm trong năng lực thực hiện

      -Bạn đang giúp cấp dưới thực hiện những nhiệm vụ gì? Bạn đã cung cấp cho họ những ví dụ cụ thể về công việc đó khi được thực hiện tốt chưa?

      -Chia sẻ kinh nghiệm của riêng bạn nếu chúng tỏ ra hữu ích.

       

    • Khi đưa ra phản hồi, nên:

      -Tập trung vào cải thiện năng lực, tránh chỉ trích hay nhấn mạnh kết quả yếu kém

      -Tập trung vào vấn đề có thể điều chỉnh và cải thiện trong tương lai

      -Đưa ra phản hồi càng sớm càng tốt

      -Tập trung vào cách hành xử chứ không phải tính tình, thái độ và nhân cách

      -Tránh nói chung chung, hãy chân thành, thực tế

  7. Bước 4: Theo dõi

    • Để giám sát sự tiến bộ
    • Giúp các cá nhân đi đúng hướng
    • Quy trình theo dõi liên tục
      • Xác định ngày giờ cụ thể để thảo luận theo dõi
      • Kiểm tra sự tiến bộ của cá nhân
      • Tiếp tục quan sát
      • Kiểm tra cách thực hiện của nhân viên và đề nghị giúp đỡ khi cần thiết
      • Xác định những phần việc có thể điều chỉnh cho kế hoạch hành động
      • Tìm hiểu những gì có tác dụng và những gì có thể cải thiện trong buổi huấn luyện.
  8. Các phương pháp huấn luyện

    1. Phương pháp ĐẨY
      • Huấn luyện viên đưa cho người được huấn luyện những yêu cầu rõ ràng về cách thực hiện từngbước
      • Hướngdẫn cụ thể, yêu cầu làm theo
      • Kiểm tra, đánh giá kết quả và yêu cầu tập đi tập lại
    2. Phương pháp KÉO
      • Chỉ ra mục tiêu, yêu cầu học viên tự đề xuất phương án giải quyết
      • Đánh giá các ưu, nhược điểm và lựa chọn giải pháp
      • Tìm ra các điểm cần cải tiến
      • Khuyếnkhích nhân viên tự tìm cách cải tiến
      • Góp ý và cùng nhân viên điều chỉnh cách cải tiến
    3. So sánh phương pháp ĐẨY vs KÉO
      • Screen Shot 2018-07-02 at 3.57.03 PM.png
    4. Phương pháp kết hợp ĐẨY và KÉO
      • Screen Shot 2018-07-02 at 3.57.19 PM
  9. Thế nào là huấn luyện hiệu quả?

    1. Huấn luyện viên NÊN:
      • Lắng nghe trước, sau đó sẽ đặt câu hỏi, đưa ra những phản hồi mang tính xây dựng và sẵn sàng đề ra những ý tưởng mới.
      • Hãy phát triển nhân viên bằng cách giao việc để tận dụng khả năng của họ.
      • Giúp đỡ nhân viên học hỏi từ những sai lầm mà họ mắc phải, xác định mục tiêu
      • Động viên, khuyến khích nhân viên
      • Thực hiện văn hóa dám thay đổi và chấp nhận rủi ro
      • Có trách nhiệm đối với kết quả huấn luyện
    2. Huấn luyện viên KHÔNG NÊN:
      • Trì hoãn việc huấn luyện cho đến trong khi không có việc gì tốt hơn để làm
      • Sợ tốn thời gian vào việc huấn luyện
      • Sợ rủi ro không giao quyền thực hiện
    3. Học viên NÊN
      • Chủ động chia sẻ cảm giác, trải nghiệm của bạn về quá trình đào tạo, điều gì chưa ổn cần điều chỉnh.
      • Hãy xem việc tiếp nhận huấn luyện là việc quan trọng bậc nhất (lùi 1 để tiến 2).
      • Hãy tận dụng tối đa thời gian và năng lực của Huấn luyện viên để đạt được tối thiểu 70-80% khả năng của họ (có thể điều này lớn hơn cả mục tiêu huấn luyện)
      • Tận dụng tối đa công việc thực tế để được trải nghiệm
      • Có trách nhiệm đối với kết quả huấn luyện
    4. Học viên KHÔNG NÊN
      • Trì hoãn việc huấn luyện cho đến trong khi không có việc gì tốt hơn để làm
  10. Tham khảo một số quy trình huấn luyện khác
    1. EDAC
      • Screen Shot 2018-07-02 at 4.03.47 PM
    2. GROW
      • Screen Shot 2018-07-02 at 4.05.11 PM.png
    3. 5D
      • Screen Shot 2018-07-02 at 4.05.38 PM.png

II. ĐÁNH GIÁ ĐÚNG NHÂN VIÊN

  • Số liệu thống kê Nhân viên mong muốn gì? (1 = Quan trọng nhất, 10 = ít quan trọng)

 

Tiêu chí Cấp quản lý nghĩ Nhân viên mong muốn
Đãi ngộ tốt 1 5
An toàn trong công việc 2 4
Cơ hội thăng tiến 3 7
Điều kiện làm việc tốt 4 9
Công việc thú vị 5 6
Được đảm bảo 6 8
Kỷ luật mềm dẻo 7 10
Đánh giá đúng về công việc đã hoàn thành 8 1
Thông cảm/giúp đỡ các vấn đề cá nhân 9 3
Cảm thấy được tham gia trong mọi việc 10 2
  • Trong công việc có 2 điều mà nhân viên luôn luôn tự hào về mình- đó là Lời khen và Sự ghi nhận của quản lý.
  • Screen Shot 2018-07-02 at 4.09.59 PM.png
  • Quy trình đánh giá nhân viên
    • Rà soát kết quả của kỳ trước
      • Hỗ trợ bằng những dữ kiện, bằng chứng cụ thể, xác thực
      • Chuẩn bị để giải quyết những vấn đề không thống nhất được
    • Tiến hành đánh giá theo mục tiêu công việc
      • Yêu cầu nhân viên tự đánh giá những mục tiêu đề ra trong năm
      • Tự mình đánh giá: nghiêm túc, chuẩn xác
      • Thu thập ý kiến từ các nhân viên khác
    • Đăt mục tiêu cho kỳ tới
      • Cung cấp các thông tin chiến lược kinh doanh, mục tiêu dự án của phòng/ công ty trong năm tới
      • Cùng nhân viên thảo luận, đánh giá, sửa đổi và thống nhất mục tiêu SMART kỳ tới
      • Ký cam kết thực hiện các mục tiêu
    • Phỏng vấn đánh giá
      • Screen Shot 2018-07-02 at 4.14.36 PM
    •  
    • Hoàn tất đánh giá
      • Khen ngợi các thành tích
        • Hỏi: Điều gì làm cho họ đạt được như vậy
      • Chỉ ra các điểm yếu và góp ý
        • Hỏi: Nguyên nhân là gì và giải pháp của nhân viên
        • Đưa ra các giải pháp của người quản lý
      • Chia sẻ ý kiến của mình
      • Thông báo kết quả đánh giá

Chúc các bạn thành công!

Leader – Hiểu về hành vi tổ chức, hành vi cá nhân để trở thành lãnh đạo giỏi

Mục tiêu:

  • Giúp hiểu khái niệm cơ bản về các yếu tố tác động đến hành vi cá nhân trong tổ chức.
  • Giúp hiểu và xác định được tính cách của bản thân và công việc phù hợp, phân công công việc phù hợp cho các thành viên trong nhóm do mình quản lý.

Nội dung bao gồm:

  • Khái niệm Hành vi tổ chức, hành vi cá nhân, tính cách
  • Các yếu tố tác động đến hành vi cá nhân• Các mô hình nghiên cứu về tính cách
  • Thực hành

1. Hiểu về Hành vi tổ chức

  • Hành vi tổ chức là một lĩnh vực nghiên cứu tác động của các yếu tố thuộc về cá nhân, nhóm làm việc và thuộc về tổ chức đối với hành vi tại nơi làm việc của một cá nhân nhằm mục đích cải thiện hiệu quả làm việc của tổ chức.

2. Tầm quan trọng của nghiên cứu Hành vi

Screen Shot 2018-06-22 at 10.51.25 AM

3. Các yếu tố ảnh hưởng tới hành vi cá nhân

Screen Shot 2018-06-22 at 10.52.25 AM

4. Khái niệm tính cách

Screen Shot 2018-06-22 at 10.53.40 AM.png

  • Các yếu tố ảnh hưởng tới tính cách: Gen di truyền, môi trường
  • Theo lý thuyết của William Marston thì:

Screen Shot 2018-06-22 at 10.55.13 AM

 

5. Phân Loại Tính Cách Theo Mô Hình MBTI

  • Hướng nội (I) hay hướng ngoại (E)
  • Giác quan (N) hay trực giác (S)
  • Lý tính (T) hay cảm tính (F)
  • Nguyên tắc (J) hay linh hoạt (P)
  • Thái độ đối với thế giới bên ngoài

Screen Shot 2018-06-22 at 10.57.45 AM

  • Nhận thức về thế giới bên ngoài

Screen Shot 2018-06-22 at 10.58.23 AM

  • Cách ra quyết định

Screen Shot 2018-06-22 at 10.59.02 AM

  • Thái độ trong cuộc sống

Screen Shot 2018-06-22 at 10.59.36 AM

  • 16 loại tính cách theo MBTI

Screen Shot 2018-06-22 at 11.00.17 AM.png

  • 16 cặp tính cách chủ yếu

Screen Shot 2018-06-22 at 11.01.08 AM

Screen Shot 2018-06-22 at 11.00.56 AM

  • Mô hình MBTI giúp cho các nhà quản lý
    • Hiểu về hành vi của cá nhân
    • Nhận ra sự khác biệt cá nhân
    • Phát triển cá nhân

6. Phân loại tính cách theo mô hình Big 5

Screen Shot 2018-06-22 at 11.05.03 AM.png

  • Tính hướng ngoại
    • Cởi mở, quảng giao, ưa giao du
    • Quyết đoán, mạnh mẽ
    • Sáng tạo
    • Tham vọng, linh hoạt, lanh lợi về mặt xã hội
  • Tính hoà đồng:
    • Lịch sự, thân ái
    • Hợp tác, đáng tin cậy
    • Không cay cú, biết chấp nhận thất bại để học hỏi
    • Tận tụy và cống hiến, biết giúp đỡ và hỗ trợ người khác khi cần
  • Tận tâm, ngay thẳng
    • Có trách nhiệm và đáng tin cậy
    • Minh bạch và trung thực
    • Sắp đặt mọi thứ rõ ràng, là người có óc tổ chức, có thể dự đoán được hành vi ứng xử
    • Kiên định trước những lời tán dương và khen ngợi, sự công nhận, phê bình hoặc chỉ trích
  • Ổn định cảm xúc
    • Tự tin, không hay cáu giận
    • Có thể dự đoán được về mặt cảm xúc (vui, buồn…)
    • Không chuyển áp lực từ cấp trên hay những gắng nặng của riêng mình hoặc sự căng thẳng cho các đồng sự
  • Sẵn lòng trải nghiệm
    • Sẵn sàng học hỏi, sẵn sàng thay đổi
    • Sáng tạo, chịu đổi mới, tò mò nhưng không dò xét
    • Được giáo dục tốt, quan tâm tới các vấn đề về văn hoá, kỹ thuật

7. Mô hình tính cách của Holland

Mô hình 6 loại tính cách để định hướng nghề nghiệp

Screen Shot 2018-06-23 at 4.21.31 PM.png

Screen Shot 2018-06-23 at 4.21.48 PM.png

8. DISC

Screen Shot 2018-06-22 at 11.35.18 AM

Screen Shot 2018-06-22 at 11.35.24 AM

Screen Shot 2018-06-23 at 4.23.48 PM.png

9. Thực hành

  • Giới thiệu website http://mbti.toppion.com/
  • Bài tập tại khóa học: 15 phút. Đánh giá tính cách và công việc phù hợp của bản thân dựa vào mô hình MBTI.
  • Bài tập thực hành thêm: Cho NV mình đang trực tiếp quản lý đánh giá thử, gửi lại kết quả cho quản lý. Quản lý xem để tham khảo và chiêm nghiệm việc mình phân công công việc hiện nay cho NV đã phù hợp chưa.

Chúc các bạn thành công!

Tester – Thiết kế test blackbox với bảng quyết định

Muốn là một Tester/QC chuyên nghiệp, chắc chắn cần biết đến cách thiết kế test blackbox và đặc biệt là sử dụng bảng ra quyết định để thiết kế các test case. Trong bài này mình sẽ giới thiệu với các bạn các nội dung sau:

  1. Kỹ thuật test blackbox là gì?
  2. Tại sao lại cần đến kỹ thuật test?
  3. Các kỹ thuật test blackbox
  4. Kỹ thuật test blackbox sử dụng bảng ra quyết định

1.Kỹ thuật test blackbox là gì?

Chúng ta cùng so sánh blackbox, whitebox và graybox qua hình sau

Screen Shot 2018-06-22 at 9.38.31 AM

2. Tại sao phải cần các kỹ thuật test?

  • Việc test thấu đáo (test tất cả các đầu vào có thể) là phi thực tế
  • Do đó: Cần sử dụng kỹ thuật test để chọn lọc các trường hợp test  một cách hợp lý mà vẫn đảm bảo không để sót lỗi (Tester/QC siêu là đây)

Screen Shot 2018-06-22 at 9.43.35 AM

3. Các kỹ thuật test blackbox

  • Phân lớp tương đương
  • Phân tích giá trị biên
  • Sử dụng bảng quyết định
  • Sử dụng biểu đồ nguyên nhân – hậu quả
  • Sử dụng biểu đồ chuyển trạng thái

Ở bài trước , chúng ta đã được biết đến các kỹ thuật test phân lớp tương đương và phân tích giá trị biên. 2 kỹ thuật này thường chỉ được áp dụng cho những đầu vào/tình   huống riêng biệt cụ thể, khi có sự kết hợp của các yếu tố đầu vào khác nhau dẫn đến kết quả hành động khác nhau, thì việc sử dụng 2 kỹ thuật này sẽ thực sự gặp khó khăn.

Bảng quyết định là một kỹ thuật để giải đáp được sự kết hợp của các yếu tố đầu vào.

  • Chúng ta cùng xem xét tình huống sau sẽ sử dụng trong suốt quá trình thực hành.

Một cửa hàng có chính sách giảm giá cho khách hàng như sau: Nếu bạn là một Khách hàng mới mở tài khoản thẻ tín dụng, bạn sẽ chiết khấu 20% cho tất cả mặt hàng bạn mua ngày hôm nay. Nếu bạn là một Khách hàng hiện có và bạn giữ một thẻ khách hàng trung thành, bạn sẽ được chiết khấu 15%. Nếu bạn có một phiếu mua hàng, bạn sẽ được chiết khấu 25% ngày hôm nay (nhưng nó không được sử dụng kết hợp với chính sách giảm giá dành cho Khách hàng mới ‘). % chiết khấu được cộng thêm vào, nếu có.

4. Bảng quyết định

  • Bảng quyết định liệt kê các nguyên nhân và kết quả dưới dạng ma trận. Mỗi cột của bảng quyết định là một tổ hợp duy nhất. 
  • Bảng quyết định nhằm mục đích hệ thống logic
  • Bảng quyết định được ứng dụng rất nhiều trong rất nhiều lĩnh vực khác nhau trong đó có kiểm thử phần mềm (thiết kế test case) 

decisiontable

5. Các bước thiết kế test case dựa trên bảng quyết định

Bước 1: Xác định các điều kiện đầu vào và đầu ra

Screen Shot 2018-06-22 at 10.26.56 AM

Thực hành: Xác định các điều kiện đầu vào và đầu ra cho tình huống phía trên.

Kết quả

  • Đầu vào:
    • KH mới mở TK (thẻ tín dụng)
    • KH có thẻ trung thành
    • KH có phiếu mua hàng
  • Đầu ra: 
    • Giảm giá 25%
    • Giảm giá 15%
    • Giảm giá 20%

 

Bước 2: Xác định các tổ hợp có thể có

  • Mỗi cột trong bảng là 1 tổ hợp các điều kiện đầu vào 
  • Mỗi ô trong bảng có thể nhận giá trị  ‘T’ (true) nếu điều kiện đầu vào đúng hoặc  ‘F’ (false) cho trường hợp đầu vào sai

Screen Shot 2018-06-22 at 10.27.28 AM.png

Thực hành: Xác định các tổ hợp có thể có của tình huống trên

Đầu vào #1 #2 #3 #4 #5 #6 #7 #8
KH mới mở TK T T T T F F F F
KH có thẻ trung thành T T F F T T F F
KH có phiếumua hàng T F T F T F T F

 

Bước 3: Hợp lý hóa (giảm bớt)  số lượng các tổ hợp đầu vào

  • Một số tổ hợp có thể không bao giờ xảy ra
  • Một số tổ hợp có thể tương đương với nhau
  • Sử dụng dấu gạch ngang ‘-’ để thể hiện trường hợp không cần quan tâm đến giá trị của đầu vào

Screen Shot 2018-06-22 at 10.28.01 AM.png

Thực hành: Hợp lý hóa (giảm bớt) số lượng các tổ hợp

Đầu vào #1 #2 #3 #4 #5 #6 #7 #8
KH mới mở TK T T T T F F F F
KH có thẻ trungthành T T F F T T F F
KH có phiếu mua hàng T F T F T F T F

Kết quả:

Đầu vào #1 #2 #3 #4 #5 #6
KH mới mở TK T T F F F
KH có thẻ trung thành T F F T T F
KH có phiếu mua hàng T F T F F

 

Bước 4: Hoàn thiện bảng quyết định

  • Xác định đầu ra mong đợi cho mỗi tổ hợp của các điều kiện đầu vào

Screen Shot 2018-06-22 at 10.23.21 AM

Hoàn thiện bảng quyết định: Xác định đầu ra mong đợi cho mỗi tổ hợp của các điều kiện đầu vào

Đầu vào #1 #2 #3 #4 #5 #6
KH mới mở TK T T F F F
KH có thẻ trung thành T F F T T F
KH có phiếu mua hàng T F T F F
Đầu vào
Chiết khấu 20% X F T F F F
Chiết khấu 15% X F F T T F
Chiết khấu 25% X T F T F F
Đầu vào #1 #2 #3 #4 #5 #6
KH mới mở TK T T F F F
KH có thẻ trung thành T F F T T F
KH có phiếu mua hàng T F T F F
Đầu vào
Chiết khấu (%) X 25% 20% 40% 15% 0%

 

Bước 5: Chuyển các cột của bảng quyết định sang thành test case

  • Thông thường mỗi tổ hợp sẽ tương ứng với 1 test case nhưng cũng có trường hợp 1 tổ hợp tương ứng với nhiều test case hoặc không tương ứng với test case nào

Screen Shot 2018-06-22 at 10.32.03 AM

  • Thực hành: Chuyển các cột của bảng quyết định sang thành test case
Test case Đầu vào Kết quả mong đợi (% Chiết khấu)
1 Khách hàng mới, có thẻ trung thành Không xảy ra
2 Khách hàng không có thẻ trung thành, có phiếu mua hàng 25%
3 Khách  hàng mới 20%
4 KH có thẻ trung thành, có phiếu mua hàng 40%
5 Kh có thẻ trung thành, không có phiếu mua hàng 15%
6 Không phải là KH mới, cũng không có thẻ trung thành, không có phiếu giảm giá 0%

 

Bây giờ các bạn hãy tự thực hiện lại theo tình huống thực hành sau đây:

Một cửa hàng có chính sách giảm giá cho khách hàng như sau: nếu khách có “thẻ người già”, khách sẽ được giảm giá 34%. Nếu khách đi cùng trẻ em dưới 16 tuổi: khách sẽ được giảm giá 50% nếu đã có “thẻ gia đình”, nếu không có thẻ gia đình thì chỉ được giảm 10%. Mỗi khách chỉ có thể sử dụng một trong hai loại thẻ

 

Chúc các bạn thành công!

Dev Lead – Checklist review code cho lập trình viên web full stack

Là một Dev Lead/Team Lead bạn nhiệm vụ của bạn không những chỉ hoàn thành công việc của mình mà một nhiệm vụ vô cùng quan trọng là review code của các thành viên trong nhóm để có chất lượng tốt nhất, đồng thời qua đó cũng huấn luyện họ có kỹ năng code tốt hơn. Trong bài này mình xin đưa ra Checklist dùng cho các Lead khi review code của 1 lập trình viên Web Full Stack.

  1. Giao diện

    • Đã tuân thủ đầy đủ UI Convention hay chưa?
    • Đã vẽ theo Thiết kế UI hay chưa?
  2. Tính năng

    • Tính năng đã được thực hiện đúng chưa? đã pass hết các functional test case chưa?
  3. Tuân thủ Coding convention

    • Đã tuân thủ Naming convention chưa?
    • Có Comment code đầy đủ chưa?
    • Đã tuân thủ Quy định về bẫy lỗi chưa?
    • Biến khai báo đúng scope, đúng kiểu dữ liệu chưa?
    • Tái sử dụng các hàm dùng chung, thư viện chưa?
    • Code có dễ bảo trì không?
    • Tuân thủ các nguyên lý clean code SOLID chưa?
    • Có FixCode (số, chuỗi…) không?
    • Có duplicate code không?
    • Code đã được tổ chức gom nhóm hoặc chia hàm nhỏ cho dễ đọc chưa?
    • Các biểu thức điều kiện phức tạp đã được đưa thành biến hoặc hàm riêng hay chưa?
  4. Đảm bảo hiệu năng tầng Application

    • JS/HTML/CSS
      • Số lượng request đã tối ưu chưa?
      • Sử dụng Bundle javascript, css chưa?
      • Sử dụng sprite images để giảm số lượng request lấy ảnh chưa? VD: ảnh icon…
      • Sử dụng CDN để tăng số lượng file download đồng thời chưa?
      • Đặt expired time cho các static resource hợp lý chưa? Các file js, css, image, icon cần có expired time khác nhau tùy theo mức độ thay đổi của file
      • Sử dụng các file css, javascript bên ngoài trang HTML để cache chưa
      • Dung lượng request tối ưu chưa? Minification javascript/css chưa? Sử dụng nén gzip các file static, dynamic resource chưa?
    • Code .NET
      • Hạn chế việc throw exception: Kiểm tra các điều kiện trước để tránh exception? Try cacth ở sự kiện hoặc method gốc?  Hạn chế rethrow, nếu có sử dụng chỉ sử dụng từ khóa throw thay cho throw ex
      • Không dùng exception điều khiển luồng logic
      • Sử dụng kiểu dữ liệu tối thiểu đáp ứng được bài toán
      • Ưu tiên sử dụng mảng thay list, chỉ định size trước nếu có thể, chỉ kiểu cụ thể của phần tử trong mảng
      • Dùng addRange thay cho add nhiều lần đối với dữ liệu dạng list
      • Với array lớn dùng for thay foreach
      • Khi cộng chuỗi với nhiều tham số, dùng StringBuilder thay cho + hoặc & (Từ 3 tham số trở lên)
      • Các phép so sánh chuỗi dùng IgnoreCase thay cho toLower
      • Hạn chế dùng dynamicInvoke
      • Hạn chế vòng lặp lồng nhau
      • Tránh dùng đệ quy
      • Dung Private thay cho Public
      • Boxing, Unboxing cast type
    • Data/ADO.Net:
      • Chỉ lấy đủ cột cần dùng?
      • Ưu tiên dùng DataReader thay Dataset?
      • Tránh dùng Auto-Generated command, command builder khi runtime.
      • Giữ Transaction ngắn nhất có thể
      • Khi muốn truy xuất nhanh thì sử dụng dataview thay cho Datatable
    • GC
      • Không tự gọi GC.Collect
      • Set Null các object không dùng đến
      • Dùng Using hoặc Try Catch Finally để giải phóng đối tượng IDisposable
      • Gọi dispose các biến có kiểu IDisposable khi dispose object chính
    • Kiểm tra MemoryLeak
    • Thread:
      • Tránh gọi Abort, để thread tự exit
      • Tránh gọi Suspend, Resume, nên dùng Monitor để quản lý thread
      • Dùng threadpool để tạo Tránh sử dụng chính object đang chứa code để làm object lock
      • Cần có một try catch cho tất cả đoạn code trong thread
    • Khi cần lấy giá trị của một hàm hoặc property thì cần gán ra một biến để tránh gọi lại hàm hoặc property nhiều lần
    • WebForm:
      • Tắt SessionState khi không dùng
      • Hạn chế số lượng request tới Server
      • Chỉ dùng ViewState khi cần thiết
      • Loại bỏ HttpModule không cần thiết
      • Dùng AJax khi có thể Validate dưới client-side thay cho server-side nếu có thể
      • Đã sử dụng thuộc tính IsPostback để tránh gọi nhiều lần các đoạn code xử lý trong hàm pageLoad() khi load lại page
      • Chỉ trả về thông tin tối thiểu vừa đủ để giảm dung lượng
      • Những task long-running chuyển sang worker xử lý
      • Sử dụng Server.Transfer thay có Response.Redirect khi có thể
    • Server caching:
      • Cân nhắc sử dụng local memory để cache dữ liệu trong phiên làm việc thay vì couchbase
      • Cache phải có timeout hợp lý
      • Chia nhỏ, phân loại cache theo nhu cầu sử dụng (tránh lưu một object lớn mà mỗi lần lấy chỉ sử dụng 1 phần nhỏ)
      • Không nên dùng key quá dài
    • Session state:
      • Không  lưu trữ dữ liệu lớn vào session
      • Sử dụng Cache và Session đã hợp lý hay chưa?
  5. Đảm bảo hiệu năng tầng Database

    • Chú ý kiểu dữ liệu, độ rộng của các biến, cột kiểu text (nvarchar, nvarchar…). Tránh lỗi khi gán dữ liệu lớn hơn giá trị max của kiểu dữ liệu
    • Nếu dùng bảng tạm thì phải khai báo collation để tránh lỗi khi collation của DB khác với collation mặc định của instance sql.
    • Chú ý giá trị NULL Trong phép so sánh =, <>, IN
    • Chú ý khi sử dụng lệnh SELECT… INTO. Kiểu dữ liệu, độ lớn của cột dữ liệu sẽ phụ thuộc vào dữ liệu —> cần cast về kiểu mong muốn
    • Chỉ dùng cursor khi không còn cách nào khác
    • Hạn chế sử dụng sub query
    • Hạn chế dùng Trigger
    • Hạn chế join với bảng dữ liệu lớn
    • Hạn chế dùng hàm trong mệnh đề WHERE –> không dùng được index
    • Tránh việc sử dụng mệnh để sau khi không cần thiết ORDER BY, DISTINCT, GROUP BY, UNION, NOT LIKE
    • Nếu có dùng biến kiểu bảng @Table có join với bảng khác thì cần có OPTION (RECOMPILE) sau câu lệnh đó
    • Tránh lấy dư thưa các cột không cần thiết trong kết quả trả về của cầu SELECT hoặc trong bảng tạm
    • Nên sử dụng GROUP BY thay cho DISTINCT
    • Cân nhắc khi sử dụng UNION hay UNION ALL: UNION tương tự DISTINCT, UNION ALL lấy tất
    • Xem xét giảm thiểu số lần select vào bảng dữ liệu lớn->nên truy xuất 1 lần để lấy kết quả ra bảng tạm và xử lý trên tập kết quả ít hơn
    • Tham số truyền vào mà được ghép bởi nhiều phần tử cần được chuyển đổi thành bảng rồi mới đưa vào tính toán
    • Dùng store khi có thể, thiết lập NO COUNT ON, READ UNCOMMIT trong store khi có thể
    • Không được dùng Transaction trên SQL trừ trường hợp đặc biệt
    • Mở connection muộn nhất, đóng connection sớm nhất khi có thể, chủ động đóng connection thay vì timeout
    • Thiết lập timeout riêng với từng loại connection (connection report để timeout lâu, còn lại để thấp, tránh để tất cả timeout lâu)
    • Hạn chế roundtrip đến database
    • Các query đã viết ra thì xem xét xem có sử dụng được Index hay không
  6. Tuân thủ các tiêu chuẩn bảo mật

    • Việc Download file phải dùng thư viện dùng chung
    • Hàm download không được phép có tham số là đường dẫn đến File trên Server.
    • Chỉ được phép Upload các loại file nhất định, không được phép upload các file có khả năng thực thi
    • Upload theo các định dạng file và dung lượng cho phép
    • Lưu trữ file do người dùng upload phải được lưu dạng mã (Guid, ID)
    • Việc Upload phải dùng thư viện dùng chung
    • Đã tuân theo các quy tắc lưu trữ file upload, file xuất khẩu hay file temp của hệ thống chưa?
    • Chỉ cho phép xuất khẩu theo một số định dạng file theo quy tắc đã chỉ ra
    • Định dạng file hỗ trợ nhập khẩu: excel, xml, csv
    • Đảm bảo không bị các lỗi bảo mật SQL injection
    • Các control cho phép người dùng nhập liệu đã kiểm tra lỗi XSS hay chưa?

———————— END ————–

iOS – Newbie – Hướng dẫn cách bắt Exception khi ứng dụng bị crash

Là một lập trình viên iOS đang tập toẹ vào nghề có lẽ bạn không khỏi ngỡ ngàng và tốn nhiều thời gian vào việc tìm hiểu tại sao ứng dụng của mình chạy lên bị crash ngay lập tức.

  • Lỗi gặp kiểu như “Thread 1: signal SIGABRT”

Screen Shot 2018-06-21 at 3.14.47 PM

  • Bạn không biết chuyện gì xảy ra, không biết lỗi xảy ra từ đâu và có thể mất nhiều thời gian để chạy đi chạy lại ứng dụng để đoán lỗi và khoanh vùng lỗi.

Đây có lẽ là điều các newbie iOS developer chằng thích chút nào. Làm sao để biết được lỗi exception ở đoạn code nào trong ứng dụng của ta đây.

Các bạn hãy làm theo 3 bước hướng dẫn dưới đây để xác định vùng gây ra lỗi để xử lý nhé!

  • Bước 1: dừng chạy ứng dụng, từ menu Debug xổ ra truy cập vào sub-menu Breakpoint và chọn Create Exception Breakpoint…

Screen Shot 2018-06-21 at 3.39.04 PM

  • Khi đó trong vùng Breakpoint sẽ xuất hiện thêm thông tin All Exceptions với ý nghĩa sẽ dừng tại dòng code mà ném ra ngoại lệ.

Screen Shot 2018-06-21 at 3.39.18 PM.png

  • Bước 2: chạy lại ứng dụng và tái lặp theo tình huống đã gây ra lỗi trước đó, bạn sẽ thấy trên XCode sẽ dừng ở dòng code sẽ gây ra ngoại lệ kèm theo callstack, giá trị các biến tại thời điểm đó.

Screen Shot 2018-06-21 at 3.39.48 PM

  • Bước 3: từ thông tin được cung cấp bạn dễ dàng tìm ra nguyên nhân gây ra lỗi exception. Các lỗi exception có thể: Null Pointer Exception, Index Out Of Bound, File Not Found Exception…

Ngoài ra, trong bài này mình cũng hướng dẫn bạn thực hiện Debug trên XCode trong tình huống chủ động đặt Breakpoint

  • Bạn có thể đặt Breakpoint tại dòng code bất kỳ trong project của mình bằng cách click chuột vào vùng hiển thị dòng code, ví dụ hình ảnh dưới của mình là dòng 29.

Screen Shot 2018-06-21 at 3.50.27 PM.png

  • Chạy ứng dụng theo kịch bản đợi khi nó dừng ở điểm Breakpoint bạn vừa đặt

Screen Shot 2018-06-21 at 3.53.32 PM

  • Tại điểm Breakpoint đang dừng, để chuyển qua lần lượt các dòng code tiếp theo bạn sử dụng phím tắt F6 (Step Over) hoặc biểu tượng ở phía dưới thanh Debug

Screen Shot 2018-06-21 at 3.55.45 PM

  • Để nhảy vào trong một hàm nào đó bạn dùng phím tắt F7 (Step Into) hoặc biểu tượng ở thanh Debug.

Screen Shot 2018-06-21 at 3.56.19 PM

  • Để thoát khỏi hàm vừa nhảy vào ra dòng lệnh tiếp theo ở bên ngoài, bạn sử dụng phím tắt F8 (Step Out)

Screen Shot 2018-06-21 at 3.56.44 PM.png

  • Và tiếp tục chạy chương trình bằng cách nhấn vào biểu tượng như nút Play trên thanh Debug (sau biểu tượng Breakpoint màu xanh)

Screen Shot 2018-06-21 at 3.55.45 PM

Chúc các bạn thành công nhé!

——————— END ——————–