DCSIMG
עמוד הבית| חבילות השירות שלנו| חומר חופשי| צור קשר
November 2009 - Posts - בלוג היועצים של מיקרוסופט ישראל

בלוג היועצים של מיקרוסופט ישראל

November 2009 - Posts

שיפור תפוקת צוות הפיתוח ללא עלויות – חלק א'

כולם רוצים לשפר את תפוקת צוותי הפיתוח, אך הרבה פעמים יש מגבלות...

איך נגדיל את תוצרי צוותי הפיתוח שלנו?

- אפשר לגייס כח אדם מקצועי יותר, מנוסה יותר וכו' - לא באמת מעשי. יש לזה עלויות, משמעויות שימור כ"א (קשה ויקר יותר לשמר כ"א איכותי יותר).
- אפשר להגדיל את הצוות - כך הצוות ייצר יותר תוצרים. מצד שני, עליות גבוהות... וכמו שכולם יודעים, אין יחס ישר בין הגדלת מספר המתכנתים לכמות התוצרים.

אני יכול להציע כאן עוד מספר הצעות שונות ומשונות, אך לכולן יש עלות...

יש לי רעיון חדשני ומהפכני - בואו נגדיל את תפוקת צוות הפיתוח ע"י צמצום טעויות/תקלות בתהליך הפיתוח!!!

משתמשים ב - Visual Studio Team System 2008? אם לא - תתחילו.
אחת הבעיות הנפוצות שנתקלתי בהן שגורמות לבזבוז זמן לחינם של צוות הפיתוח היא אינטגרציה.

תרחיש:

2 מתכנתים עובדים על resource משותף - נניח מחלקה (class).
ביום ראשון בבוקר מגיע מתכנת א' ומבצע שינוי במחלקה - נניח שהוא משנה את ה- type ב - Input של אחת הפונקציות. מבצע checkout, עורך את השינוי ולסיום checkin.
ביום שני, מגיע מתכנת ב' ומבצע שינוי באותה מחלקה - מבצע checkuot לקובץ, מבצע קריאה לפונקציה אותה שינה מתכנת א' יום לפני. אך מכיוון שלא ביצע "get-latest version" לפני השינוי, הוא "מכיר" את החתימה הישנה של הפונקציה.
(המקרה נפוץ יותר בהוספת ערכים ל-  enum).
בהנחה (שאינה פרועה כלל) שמתכנת ב' ממשיך לעבוד על הרכיב שלו ללא ביצוע checkin, יתכן שרק בסוף השבוע, כשיעשה checkin, תקפוץ לו הודעה על קונפליקט. כלומר, 4 ימי עבודה הוא עבד בהנחה שלפונקציה המסויימת יש חתימה שכבר השתנתה.

 

איך ניתן להמנע ממצב זה?

כמובן – כל check-out לקובץ, יבצע באופן אוטומטי get latest version.

איך?
ע"י הגדרה פשוטה במאפיינים של ה - Team Project - יש לסמן את האפשרות של "Enable get latest on check-out":

זהו, מניסיוני, כ-80% מבעיות האינטגרציה בצוות נפתרו.

ואם תהיתם למה המאפיין הזה אינו מסומן כברירת מחדל, עיינו בהסברים המלומדים הבאים שעושים שכל בעניין:
http://blogs.msdn.com/buckh/archive/2005/08/20/454140.aspx

חומר נוסף:

How to: Enable Team Foundation Version Control to Get the Latest Files on Check-Out
Add-in מעניין שמעלה הודעה “האם לבצע Get latest…”

 

בהצלחה.
טל

 

 

שירותי MCS רלוונטיים

  • (PDF) שירות ניתוח פערי ארכיטקטורה
  • (PDF) שירות ניתוח פערים ושיפור ביצועים
  • (PDF) סדנאות של MCS
  • (PDF) שירותי ניהול מחזור חיים של אפליקציה – ALM
  • ארכוויז מס’ 5 – למחזר או לא למחזר Application Pool?5

    Alik Levin     ביצוע Recycle ל-Application Pool של IIS שלמעשה הוא w3wp.exe גורם ליצירת תהליך w3wp.exe חדש, אובדן כל ה-State ואיתחול של אפליקציה ASP.NET. כל זה גורם הן לחווית משתמש ירודה, הרי לא נעים לחטוף הודעת שגיאה באמצע מילוי טופס כלשהו, והן לפגיעה ב-Scalability, הרי עם יש ריבוי של Recycles וגידול בפניות של משתמשים אז זמני תגובה לא יהיו משהו בלשון המעטה.

    אז למה יש את היכולת ב-IIS להגדיר סוגים שונים של Recycles?

    הנה שלוש סיבות שאני מוצא הגיוניות:

    • האפליקציה מאוד “חולה” – גורמת לזליגת זכרון, Deadlocks – אך אין שליטה של קוד מקור
    • האפליקציה מואד “חולה” אך בדיוק עובדים על הפתרון למניעת זליגת זכרון או Deadlocks, בזמן פיתוח ה-Fix מגדירים בינתיים את Recycles
    • בוצע Capacity Planning לא נכון – מגדירים Recycle בזמן שמבצעים רכש של שרת או זכרון כדי להגדיל את קיבולת של האפליקציה.

    הגדרת Recycle הוא Workaround ולא פתרון.

    מה לדעתך סיבה נוספת להגדיר Recycle לאפליקציה?

    חומר רלוונטי

     

    שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

    בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

     

    This template is made with PracticeThis.com plugin for Windows Live Writer

    ארכיטיפ מס’ 3 – תחבר את שיר הנושא, שמור על ארכיטקטורה יציבה

    Alik Levin     הנה טיפ קטן שיעזור לך לקבוע מסלול ארכיטקטוני ברור וגם להקפיד להשאר על המסלול – תחבר שיר הנושא.

     

    אני לא מדבר על זה שאתה צריך להחליף את המקצוע ולהיות מלחין או משורר אני מדבר על יצירת Theme של הפרויקט. לא ידעתי איך לתרגם את זה לעברית אז קראתי לזה שיר הנושא.

    הנה ה-Theme שבנינו באחד הפרוייקטים “פיתוח מהיר המתמקד בתרחישים קריטיים חיוניים תוך מימוש ביצועים מדהימי “.

    • פיתוח מהיר. כמובן שהיינו לחוצים עם לו”ז לכן כש עלו דברים שהיו יכולים להאיט את הפיתוח – שרנו את השיר והדברים ירדו מהר מאוד מהפרק.
    • תרחישים מרכזיים. כאן הפוקוס היה על דרישות של מנהלים. ברגע שרצינו להתעסק ולממש משוה זניח – שרנו את השיר הוחזרנו חזרה לפיתוח של דברים חשובים.
    • ביצועים מדהימים. הפוקוס המרכזי היה שיפור ביצועים ובניית מערכת ממש מהירה כדרישה מהלקוח. ברגע שעלו נושאים שסיכנו את ביצועי המערכת – שרנו את השיר והורדנו את הסיכונים מייד.

    מה השיטה שלך לשמור פוקוס ולא להתבדר?

    חומר רלוונטי

     

    שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

    בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

     

    This template is made with PracticeThis.com plugin for Windows Live Writer

    ארכיטקט-ידיים-מלוכלכות מס’ 3 – ניטור תעבורה ברשת

    Alik Levin     אחד היכולות החשובות באפליקציה היא Manageability – יכולת ניטור כל מה מתרחש באפליקציה וברכיבים שלה, כולל בסיס נתונים.

    אז עם מה מנטרים?

    • צד לקוח - Fiddler. מנטר תעבורת HTTP, מתאים ל-ASP.NET וגם ל-WCF עבור bindings מבוססי HTTP.
    • צד IIS – לוגים של IIS. יודעים כמה יש פניות, כמה זמן לקחו הפניות, כמה חומר נכנס ויצא לאםליקציה, מתאים ל-ASP.NET וגם WCF כאשר מתארח ב-IIS.
    • אפליקציה – מימוש עצמי של Instrumentation. האפשרויות הן שימוש ASP.NET Healthmonitoring, Custom Perfcounters, System.Diagnostic.Trace. וכמובן רכיבי צד ג’.
    • צד של בסיס נתונים – SQL Profiler. מאפשר ניטור בקשות לבסיס הנתונים, מנטר זמן שאילת, מה השאילתה, כמה רשומות נקראו ועוד. מקרה מיוחד  - Oracle. שעושים חיים קצת יותר קשים מצד בסיס הנתונים עצמו אך מצד ODP – Oracle DotNet Provider מגיע הצלה שהיא Debug Tracing המאפשרת לנטר פניות ל-Oracle בלי להתחנן ל-DBA, תענוג.
    • Netmon. מאפשר ניטור רשת, עבור משתמשים מתקדמים
    • System.Net built-int tracing – מאוד שימוש לזיהוי בעיות עבור רכיבים שמבצעים פניות ב-Remoting ו-Web Services.
    • netstat. ניטור יצירת תקשורת כלפי חוצה, זה עוזר לזהות תעבורה “בלתי צפויה” באפליקציות מבוזרות – מציג תמונה סטאטית:
      • clip_image001
    • Process Explorer. כלי מדהים בפני עצמו עם יכולות בלתי מוגבלות – ניתן להשתמש בטאב של TCP כדי לזהות התקשרויות ברמת process, מציג תמונה דינאמית עדכנית:
      • clip_image001[6]
    • Procmon. עוד כלי ממשפחת Sysinternals המדהימה – רושם היסטוריה של גישות לרשת [מעבר לניטור של process, גישה לקבצים ו-registry]:
    • clip_image001[8]

    מה כלי ניטור שאתה משתמש?

    שירותי MCS רלוונטיים

    חומר רלוונטי

     

    שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

    בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

     

    This template is made with PracticeThis.com plugin for Windows Live Writer

    סדנת פיתוח מונחה ביצועים של MCS

    Alik Levin     בשבוע שעבר העברנו סדנת פיתוח מערכות מונחה ביצועים הראשונה של MCS באוירה אינטימית ל-13 משתתפים במשרדי מיקרוסופט ישראל ברעננה. מטרת הסדנה היתה להקנות כלים למקבלי החלטות טכנולוגיים. הסדנה כיסתה את הנושאים הבאים:

    image
    • Module 1: Performance Engineering Overview
    • Module 2: Performance Architecture and Design
    • Module 3: IE and IIS 7.0 Performance
    • Module 4: Performance Modelling
    • Module 5: NET FX Performance Fundamentals
    • Module 6: Troubleshooting common performance bottlenecks

    משתתפי הסדנה הסכימו להצטלם במיוחד לבלוג שלנו – מצטער על האיכות התמונה, חייב לשדרג את המצלמה בטלפון שלי :)

    clip_image001

    קיבלנו פידבק מעודד ממשתתפים וגם קיבלנו פידבק בונה.

    אנחנו נערכים לסדנה הבאה בדצמבר שתכלול את הפידבק שקיבלנו.

    נשמח לראות אותך בין המשתתפים!

    שירותי MCS רלוונטיים

  • (PDF) שירות ניתוח פערי ארכיטקטורה
  • (PDF) שירות ניתוח פערים ושיפור ביצועים
  • (PDF) שירות תכנון וניתוח בדיקות ביצועים
  • (PDF) סדנת פיתוח מערכות מונחה ביצועים
  • שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

    בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

    This template is made with PracticeThis.com plugin for Windows Live Writer

    תפקידו של הארכיטקט

    כן, אני יודע, כבר נכתב פוסט אחד או שניים (או שבעים…) על הנושא הזה. אבל הפעם אני רוצה לתת את רשות הדיבור ללקוח שלנו, שאמר את הדברים הבאים בפגישת סיכום על עבודה של אחד הארכיטקטים שלנו אתו.

    הלקוח הגדיר את עבודת הארכיטקט כ- “נפלאה”. כשהתבקש לפרט, אמר את הדברים הבאים:

    “עד שהגיע הארכיטקט, היו לנו כל מיני רעיונות מרחפים באוויר. כשהתחלנו לעבוד אתו, הוא הוריד את הרעיונות לקרקע, גרם לנו לחשוב עליהם,וסייע לקבל החלטות מושכלות הן ברמה הארכיטקטונית והן ברמה העסקית.”

    בעיני, זוהי אחת התרומות החשובות ביותר של ארכיטקט. תכנון ארכיטקטורה הוא חשוב, אבל זיהוי הדרישות האמיתיות והצורך העסקי, והיכולת לצלול מהר לעולם תוכן חדש ולא מוכר ולהרגיש מספיק בטוח על מנת לספק תובנות והמלצות – זהו הערך האמיתי של ארכיטקט מקצוען.

    ארכוויז מס’ 4 – מה הקונפיגורציה האופטימאלית ל-WCF?

    Alik Levin     WCF היא טכנולוגיה המאפשרת הפעלת רכיבים מרחוק ויש לה מספר מקומות הניתנים לאופטימיזציה:

    • Proxy. יצירת Proxy היא פעולה לא קלה ולכן ניתן להפתות לבצע Caching ל-Proxy כדי לחסוך זמן הקמת Proxy מחדש. מצד שני Cached Proxy יכול ליצור מצב שבו הערוץ תקוע או תפוס ולא ניתן לבצע עוד פניות – משהו שחוסם יכולת Scalability.
    • אבטחת מידע. חלק מ-Bindings מפעילים Windows Integrated Authentication כברירת מחדל (wsHttpBinding) וחלק לא מפעילים אבטחת מידע בכלל (basicHttpBinding). זוהי הסיבה שישנו הבדל בין זמני תגובה בקונפיגורציה ברירת מחדל עובר שני ה-Bindings.
    • Serialization. ככל שהמסרים גדולים יותר יותר זמן מתבזבז על Serialization. למזלנו WCF מציע מנגנון חזק של הגדרה מה מסתרלז ומה לא ע”י [Datamember], הבעיה מתעוררת כאשר רוצים לשלוח ל-WCF מבנה נתונים מסוג DataSets – קשה אם לא אפשרי להתחיל להגדיר בתוך DataSet מסתרלז ומה לא – לא רוב לא מתעסקים עם זה ואז כל ה-DataSet מסתרלז, פעולה כבדה למדי.
    • עוד אבטחת מידע. ברגע שמסר עבר Serialization הוא עובר הגנה ע”י הצפנה וחתימה עבור Bindings שתומכים בזה – כמו wsHttpBinding. ככל שהמסר גדול יותר הפעולה ארוכה יותר. לא ניתן לבטל חתימה והצפנה של מסרים ע”י קונפיגורציה אלא בקוד בלבד
    • Throttling. ברמת ה-Service ניתן להגדיר מספר פרמטרים שחוסמים מספר פניות בו זמניות הניתנות לביצוע. ניתן לשחרר אותם עד אין סוף אבל אז נתקלים בחסם של Threads זמינים וכתוצאה פוגעים קיבולת של השרת. בשורות טובות – הגדורת אלה קצת יותר משוחררות ב-Net Fx 4.0

    שורה תחתונה… אני אוהב אך שניק אלן, אחד האנשים הבכירים בקבוצת WCF, מגדיר:

    clip_image001

    מה השיקולים שלך לאופטימיזציה של WCF?

    חומר רלוונטי

     

    שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

    בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

     

    This template is made with PracticeThis.com plugin for Windows Live Writer

    Using ASP.NET to Generate Dynamic JavaScript

    Alik Levin     NOTE: I am excited to have Rick Kiessig as our guest blogger. Rick worked with Myspace, MSN, eBay, and Silicon Valley’s MTC to mention a few. His recent work is a book Ultra-Fast ASP.NET which anyone who’s serious about performance should buy once it is out this month. Rick shares with us a little trick about how to generate dynamic JS so it can be then cached to boost performance.

    When you get down to it, ASP.NET is really just a fancy way of generating text in response to an HTTP request. Although that text is normally HTML, it doesn’t have to be. You can also use it to create JavaScript, CSS or even robots.txt.

    As a practical application, think about how you would localize text that resides in a script file. One solution might be to detect the desired language and redirect to an appropriate, localized version of the script file. Alternatively, you might include text for all supported languages in the same script file, and choose between them on the client. However, a better way is use ASP.NET to generate a dynamic version of the script file. The result helps performance by preventing a redirect, eases maintenance by allowing you to partition localized strings in the same way that you do for the rest of your application, and minimizes the size of the downloaded file.

    After defining your localization strings in a global resource file, as you would for a web page, the next step is to create an .aspx file and set StyleSheetTheme to be an empty string. If you don’t do that, then the runtime will insist on a <head> section in the .aspx file:

    <%@ Page Language="C#" AutoEventWireup="false" CodeFile="script.aspx.cs"
        Inherits="scripts_script" EnableViewState="false" StyleSheetTheme="" %>
    <%@ Import Namespace="Resources" %>
    <%@ OutputCache Duration="259200" VaryByCustom="language" VaryByParam="None" %>
    function test() {
      testinfo.innerHTML = "<%= Resource.Email %>";
    }

    Import the Resources namespace, to make it easier to reference. You can also enable output caching here, so that the result will be cached on the client and at the server. Using VaryByCustom will allow you to vary the cache output based on the user’s language choice, through whichever mechanism is appropriate for the rest of your application (you will also need a GetVaryByCustomString() method, which I haven’t shown here).

    The JavaScript itself then follows. In this case, you have a function that sets the innerHTML property of an element on the page to the value of a string that you obtain from the resource file. Of course, you can do any of the same kinds of server-side operations here that you would do for a web page, including the use of custom user controls, browser-specific code, and so on.

    Here’s the code-behind:

    using System;
    
    public partial class scripts_script
    {
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.Response.ContentType = "application/x-javascript";
        }
    }

    The only thing you need to do is to set the MIME type of the response to indicate that it’s JavaScript.

    One complication that can arise with this approach is that although it supports different languages for different users, it doesn’t allow a user to switch from one language to another. The brute-force solution is not to allow the script file to be cacheable. A better way, that retains cacheability, is to have dynamic code on the client that selects a different version of the script file based on the language the user selects. The script can figure that out based on a cookie. The ultimately requested URL might include a query string that specifies the language, or you could use URL rewriting on the server to direct URLs without query strings to the same .aspx file. Using URL rewriting and avoiding a query string can allow the result to be remain cacheable by the high-performance http.sys cache.

    Richard Kiessig
    Author of Ultra-Fast ASP.NET (published by Apress, Oct 2009)
    Visit my new site at http://www.12titans.net/  (available at the end of Oct 2009)

    כנס patterns & practices בישראל

    Alik Levin     לפני חודש התקיימה פסגת patterns & practices ברדמונד. היית מת לנסוע לשם ולשמוע מרצים בעלי שם עולמי כולל מרטין פולייר.

    היי! הנה רעיון – במקום לנסוע לשם בוא נביא את המרצים לכאן, לישראל. אני רציני. אבל אני חייב את עזרתך לפני שאני מתחיל לפרפר. תגיד לי – על מה היית רוצה לשמוע בכנס הזה? היית מוכן לשלם סכום סמלי עבורו? רעיונות נוספים לכנס כזה בארץ?

    הנה כמה חומרי עזר בשבילך:

    תן לי להרגיש שיש דרישה בארץ לכנס הזה ואני אתחיל להזיז ת’עניינים.

    תשאיר בהערות את התגובה שלך מטה.

    אל תתבייש – זה בשבילך!

     

    שירותי MCS רלוונטיים

  • (PDF) שירות ניתוח פערי ארכיטקטורה
  • (PDF) שירות ניתוח פערים ושיפור ביצועים
  • (PDF) סדנאות של MCS
  • (PDF) שירותי ניהול מחזור חיים של אפליקציה – ALM
  •  

    שמי אליק לוין ואני מתרכז ב- Architecture, Security, and Performance באפליקציות Net.

    בזמני הפנוי אני מפתח את עצמי בתחומים רבים אחרים.

     

    This template is made with PracticeThis.com plugin for Windows Live Writer

    הצד הפחות יפה של תבניות עיצוב

    Alik Levin     הערה: אני שמח לארח את שחר בר (ברזניצקי), ארכיטקט מנוסה בתחום High Scalable Applications. שחר משתף את הנסיון שלו עם מימוש לא נכון של תבניות עיצוב. שווה קריאה!

    כשאנחנו ממליצים, בכובע של ארכיטקטים/מנהלי-פיתוח, על שימוש בpatterns מוכרים בפני צוותי הפיתוח אנו צריכים להעביר לא רק את העקרונות שמאחורי הpatterns אלא גם את השיקולים לשימוש או הימנעות משימוש בהם. מבין מגוון הגורמים שיש לשקול, הגורמים שלראייתי הם העיקריים הינם התאמת רמת וניסיון כוח האדם למורכבות הpatterns וצפי ההתפתחות העתידי של המערכת/הקוד.

    הנושא הראשון שיש לשים לב אליו הוא השילוב של מתכנתים בעלי מוטיבציה אך מעוטי ניסיון יחד עם patterns מתוחכמים. השילוב הנ"ל עלול לגרור מספר תופעות לא נעימות:

    Pattern mismatch

    מתכנתים שזה עתה למדו patterns מתקשים לזהות את הpattern הנכון לבעייה ועלולים, די בקלות, לבחור את הpattern הלא נכון. הדבר עלול לגרור מימושים משונים ומאולצים שלא רק שלא יועילו אלא שיגרמו נזק כתוצאה מקוד לא מובן וחסר היגיון.

    Pattern mania

    מתכנתים שנחשפו לpatterns לראשונה מתלהבים מאד מהיופי והאלגנטיות שלהם וכתוצאה מכך מנסים להחיל את הpatterns על כל בעייה שנקרית בדרכם, גם אם היה אפשר לפתור אותה בלולאה ושני תנאי if פשוטים. הסיכון הוא באבדן זמן יקר על over architecture וכמובן בקוד בלתי קריא.

    Pattern mis-implementation

    יישום לא נכון של pattern מורכב עלול במקרה הטוב לא להזיק אך במקרה הרע יוביל לבעיות לוגיות שקשה לאתר.

    מכאן עולה הצורך בליווי של מוביל טכנולוגי מנוסה בשלבי הdesign בתקופה בה נחשפים צוותי הפיתוח לטכניקות תכנון/ביצוע מורכבות. הערך המוסף של ליווי כזה הוא החצנת תהליך קבלת ההחלטה לשימוש בpattern זה או אחר (אם בכלל) ע"י הארכיטקט אל מול המפתחים, על מנת שיבינו לא רק את היתרונות אלא גם את הבעיות והסיכונים.

    הנושא השני שיש לשים לב אליו הוא הצפי לעתיד המערכת. עבור מערכת בעלת אחוזי תחזוקה נמוכים ביותר או בעלת צפי שינויים עתידי נמוך אין צורך ואין טעם להגיע לפסגת הגנריות והשלמות. לפעמים אפשר לכתוב קוד quick and dirty אם הוא עושה את העבודה ואף אחד לא יגע בו. אם בעתיד יחליטו להרחיב או לשנות את המערכת בצורה משמעותית, אז נשקול לבצע refactoring ולהפוך את הקוד ל"נכון" יותר.  עקב אכילס היחיד של נושא זה הוא הלקוח – חשוב להציג בפני הלקוח את האסטרטגיה הנ"ל לפיתוח המערכת(בין אם הלקוח הוא חיצוני כמו בחברת פרויקטים או פנימי כמו בחברת מוצר) על מנת ליישר קו כדי למנוע אי הבנות עתידיות בנושא הצורך בrefactoring.

    לסיכום

    לפני שמלמדים patterns כדי לשנן את עקרונות KISS ו-YAGNI

    שירותי MCS רלוונטיים

    חומר רלוונטי