פתרון שאלה מראיון עבודה

אבי364

New member
בראיון נשאלתי את השאלה הבאה :
Dll scanner system:

The DLL scanner is a tool that scans DLLs in specific paths and verifies the consistency of each DLL:

  • Version
  • Created date
The tool should verify that each DLL stands on the required version and created date (by days – for example the DLL was created 10 days ago).

The output will be list of inconsistent DLLs including inconsistency reason and DLL path.


הפתרון שלי מצורף בקובץ.
נדחתי במיידי . 10 דקות שאחרי ששלחתי את הפתרון . למה הפתרון כל כך גרוע ?
 

אבי364

New member
ברור שנדחית - לכתוב "הפתרון שלי מצורף בקובץ" מבלי לצרף את הקובץ - למה ציפית
מצורף עכשיו. סליחה
קוד:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DllSearcher
{
    public partial class edtDllFolderPath : Form
    {

        Dictionary<string, DllNotCompatible> NotValidDll = new Dictionary<string, DllNotCompatible> { };
        enum DllNotCompatible
        {
            Version,
            Date,
            Version_And_Date
        }
        
        public edtDllFolderPath()
        {
            InitializeComponent();
            InitDefaultValues();
        }

        private void InitDefaultValues()
        {
            txtMajorVer.Text = "1";
            txtMinorVer.Text = "0";
            txtBuildVer.Text = "6";
            txtRevision.Text = "8";
            textFilePath.Text = "c:\\temp\\Dll folder";
            this.Text = "Dll scanner system";
            dateTimePicker1.Value = new DateTime(2020, 10, 25);
            btnStartSearch.BackColor = Color.Yellow;
            

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string Dllver = "";
                string output = "";
                string CreatedDateStr = "";
                string details = "";
                if (Directory.Exists(textFilePath.Text) == false)
                {
                    MessageBox.Show("The folder " + textFilePath.Text + " is not exist");
                }
                else
                {

                    string[] ALLFiles = Directory.GetFiles(textFilePath.Text, "*.dll", SearchOption.AllDirectories);
                    foreach (string CurrentFile in ALLFiles)
                    {

                        CheckDll(CurrentFile, ref Dllver, ref CreatedDateStr);

                    }
                    foreach (KeyValuePair<string, DllNotCompatible> CurrentItem in NotValidDll)
                    {
                        switch (CurrentItem.Value)
                        {
                            case DllNotCompatible.Date:
                                details = "Dll created date is " + CreatedDateStr;
                                break;
                            case DllNotCompatible.Version:
                                details = "Dll ver is " + Dllver;
                                break;
                            case DllNotCompatible.Version_And_Date:
                                details = "Dll create date is " + CreatedDateStr + " and version is " + Dllver;
                                break;
                        }
                        
                        
                        output += "Dll path not valid " + CurrentItem.Key + " because " + details + "\n";

                    }
                    if (output == "")
                    {
                        output = "There is no dll that is not valid";
                    }
                    MessageBox.Show(output, "Not valid dlls");

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception while searching dll " + ex.Message + "\n" + "Please send screenshot of this error to admin");

            }
            
        }

        /// <summary>
        /// Verify if dll
        /// </summary>
        /// <param name="CurrentFile"></param>
        /// <returns></returns>
        private Dictionary<string, DllNotCompatible> CheckDll(string CurrentFile, ref string DllVer, ref string CreatedDateStr)
        {
            DateTime CreatedDate = File.GetCreationTime(CurrentFile);
            CreatedDateStr = CreatedDate.ToString();


            DllVer = FileVersionInfo.GetVersionInfo(CurrentFile).FileVersion;
            //default delimiter
            int major, minor, build, revision;
           try
            {
                major = (int)Convert.ToInt64(DllVer.Split('.')[0]);
                minor = (int)Convert.ToInt64(DllVer.Split('.')[1]);
                build = (int)Convert.ToInt64(DllVer.Split('.')[2]);
                revision = (int)Convert.ToInt64(DllVer.Split('.')[3]);
            }
            //in case dll seperate by point instead comma
            catch (Exception ex)
            {
                Console.WriteLine("try to divide by comma instead");
                 major = (int)Convert.ToInt64(DllVer.Split(',')[0]);
                 minor = (int)Convert.ToInt64(DllVer.Split(',')[1]);
                 build = (int)Convert.ToInt64(DllVer.Split(',')[2]);
                 revision = (int)Convert.ToInt64(DllVer.Split(',')[3]);
            }
            
            
            Version Dllversion = new Version(major, minor, build, revision);
            int Day = dateTimePicker1.Value.Day;
            int Month = dateTimePicker1.Value.Month;
            int Year = dateTimePicker1.Value.Year;

            DateTime DateLimitation = new DateTime(Year, Month, Day);
            TimeSpan difference = CreatedDate - DateLimitation;

            
            Version VersionLimitation = new Version((int)Convert.ToInt64(txtMajorVer.Text), (int)Convert.ToInt64(txtMinorVer.Text), (int)Convert.ToInt64(txtBuildVer.Text), (int)Convert.ToInt64(txtRevision.Text));
            if (Dllversion < VersionLimitation)
            {
                
                
                if (difference.Days >10)
                {
                    if (!NotValidDll.ContainsKey(CurrentFile)) NotValidDll.Add(CurrentFile, DllNotCompatible.Version_And_Date);


                }
                else
                {
                    if (!NotValidDll.ContainsKey(CurrentFile)) NotValidDll.Add(CurrentFile, DllNotCompatible.Version);
                }

            }
            else  if (difference.Days > 10)
                {
                if (!NotValidDll.ContainsKey(CurrentFile))  NotValidDll.Add(CurrentFile, DllNotCompatible.Date);
            }
            
            return NotValidDll;
        }

      
    }
}
 

אבי364

New member
מצורף עכשיו. סליחה
מצורף עכשיו. סליחה
קוד:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DllSearcher
{
    public partial class edtDllFolderPath : Form
    {

        Dictionary<string, DllNotCompatible> NotValidDll = new Dictionary<string, DllNotCompatible> { };
        enum DllNotCompatible
        {
            Version,
            Date,
            Version_And_Date
        }
       
        public edtDllFolderPath()
        {
            InitializeComponent();
            InitDefaultValues();
        }

        private void InitDefaultValues()
        {
            txtMajorVer.Text = "1";
            txtMinorVer.Text = "0";
            txtBuildVer.Text = "6";
            txtRevision.Text = "8";
            textFilePath.Text = "c:\\temp\\Dll folder";
            this.Text = "Dll scanner system";
            dateTimePicker1.Value = new DateTime(2020, 10, 25);
            btnStartSearch.BackColor = Color.Yellow;
           

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string Dllver = "";
                string output = "";
                string CreatedDateStr = "";
                string details = "";
                if (Directory.Exists(textFilePath.Text) == false)
                {
                    MessageBox.Show("The folder " + textFilePath.Text + " is not exist");
                }
                else
                {

                    string[] ALLFiles = Directory.GetFiles(textFilePath.Text, "*.dll", SearchOption.AllDirectories);
                    foreach (string CurrentFile in ALLFiles)
                    {

                        CheckDll(CurrentFile, ref Dllver, ref CreatedDateStr);

                    }
                    foreach (KeyValuePair<string, DllNotCompatible> CurrentItem in NotValidDll)
                    {
                        switch (CurrentItem.Value)
                        {
                            case DllNotCompatible.Date:
                                details = "Dll created date is " + CreatedDateStr;
                                break;
                            case DllNotCompatible.Version:
                                details = "Dll ver is " + Dllver;
                                break;
                            case DllNotCompatible.Version_And_Date:
                                details = "Dll create date is " + CreatedDateStr + " and version is " + Dllver;
                                break;
                        }
                       
                       
                        output += "Dll path not valid " + CurrentItem.Key + " because " + details + "\n";

                    }
                    if (output == "")
                    {
                        output = "There is no dll that is not valid";
                    }
                    MessageBox.Show(output, "Not valid dlls");

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception while searching dll " + ex.Message + "\n" + "Please send screenshot of this error to admin");

            }
           
        }

        /// <summary>
        /// Verify if dll
        /// </summary>
        /// <param name="CurrentFile"></param>
        /// <returns></returns>
        private Dictionary<string, DllNotCompatible> CheckDll(string CurrentFile, ref string DllVer, ref string CreatedDateStr)
        {
            DateTime CreatedDate = File.GetCreationTime(CurrentFile);
            CreatedDateStr = CreatedDate.ToString();


            DllVer = FileVersionInfo.GetVersionInfo(CurrentFile).FileVersion;
            //default delimiter
            int major, minor, build, revision;
           try
            {
                major = (int)Convert.ToInt64(DllVer.Split('.')[0]);
                minor = (int)Convert.ToInt64(DllVer.Split('.')[1]);
                build = (int)Convert.ToInt64(DllVer.Split('.')[2]);
                revision = (int)Convert.ToInt64(DllVer.Split('.')[3]);
            }
            //in case dll seperate by point instead comma
            catch (Exception ex)
            {
                Console.WriteLine("try to divide by comma instead");
                 major = (int)Convert.ToInt64(DllVer.Split(',')[0]);
                 minor = (int)Convert.ToInt64(DllVer.Split(',')[1]);
                 build = (int)Convert.ToInt64(DllVer.Split(',')[2]);
                 revision = (int)Convert.ToInt64(DllVer.Split(',')[3]);
            }
           
           
            Version Dllversion = new Version(major, minor, build, revision);
            int Day = dateTimePicker1.Value.Day;
            int Month = dateTimePicker1.Value.Month;
            int Year = dateTimePicker1.Value.Year;

            DateTime DateLimitation = new DateTime(Year, Month, Day);
            TimeSpan difference = CreatedDate - DateLimitation;

           
            Version VersionLimitation = new Version((int)Convert.ToInt64(txtMajorVer.Text), (int)Convert.ToInt64(txtMinorVer.Text), (int)Convert.ToInt64(txtBuildVer.Text), (int)Convert.ToInt64(txtRevision.Text));
            if (Dllversion < VersionLimitation)
            {
               
               
                if (difference.Days >10)
                {
                    if (!NotValidDll.ContainsKey(CurrentFile)) NotValidDll.Add(CurrentFile, DllNotCompatible.Version_And_Date);


                }
                else
                {
                    if (!NotValidDll.ContainsKey(CurrentFile)) NotValidDll.Add(CurrentFile, DllNotCompatible.Version);
                }

            }
            else  if (difference.Days > 10)
                {
                if (!NotValidDll.ContainsKey(CurrentFile))  NotValidDll.Add(CurrentFile, DllNotCompatible.Date);
            }
           
            return NotValidDll;
        }

     
    }
}
משום מה צרף קובץ לא עבד לי אז עשיתי כאן ב"הכנס קוד"
 

randomUser432

New member
קח את הבדיקה שלי בערבון מוגבל אני כבר שנים לא כתבתי בC# וגם לא יצא לי להתעסק בלוגיקה מהסוג הזה

אז כמה דברים:
א.הייתי משנה את השמות משמות דיפולטיים(button1_Click, dateTimePicker1 וכדומה) לשמות עם משמעות
ב.אתה מניח שהתיקייה "c:\\temp\\Dll folder" קיימת במחשב בדיקה, זו הנחה סבירה?
ג.

Dictionary<string, DllNotCompatible> NotValidDll = new Dictionary<string, DllNotCompatible> { };
יכול להיות שאני מתבלבל אבל זה לא אמור להסתיים עם () ?
ד.
DllVer = FileVersionInfo.GetVersionInfo(CurrentFile).FileVersion;
//default delimiter int major, minor, build, revision;
אתה בטוח שכל גרסה של DLL חייבת להיות בפורמט הזה? ואם כן למה אתה מזהה אותו בtry-catch ולא עם if ?

ה.כתיבת הערות בקוד והדפסות למסך - כל הטקסט האנושי צריך לעמוד בכללי התחביר/דיקדוק וכדומה - כלומר מתחיל באות גדולה, משפט מסתיים בנקודה וכמובן הוא צריך להשמע הגיוני, אם אתה בוחר לכתוב מושג באות אותיות גדולות(DLL) אז תקפיד על זה ואל תשנה את הכיתוב בהמשך(dll, Dll).
ו.
major = (int)Convert.ToInt64(DllVer.Split('.')[0]);
במקום לעשות split כארבעה פעמים אתה יכול לעשות פעם ולעבוד עם התוצאה
ז.
(int)Convert.ToInt64(DllVer.Split(',')[0]);
אתה בטוח שזה תמיד Int64 ולא יכול להכיל אותיות(זה בערך כמו מה שכתבתי בסעיף ד' - זה קופץ לי חזק בעין אז אני כותב את זה עוד פעם מכיוון קצת אחר)?
ח.
catch (Exception ex)
בדרך כלל מומלץ לתפוס שגיאה כמה שפחות רחבה - יכול להיות בכלל שFileVersion החזיר מחרוזת ריקה ובגלל זה נכנסת לcatch, בכללי כל האזור של העיבוד גרסה לא נראה טוב.
ט.
(int)Convert.ToInt64(txtMajorVer.Text)
אתה צריך לבדוק את הקלט מהמשתמש(מה אם הוא מכניס אותיות?), ולמה אתה מבצע המרה לInt64 ואז לint ?
י.
/// <summary> /// Verify if dll /// </summary> /// <param name="CurrentFile"></param> /// <returns></returns>
הערה הזאת אנמית ולא נותנת מידע - היה עדיף להרחיב אותה או למחוק אותה
כ.אתה מבין שזה לא כל הקוד שלך ויש לך עוד קוד(המחלקה מוגדרת כpartial ) כמעט בוודאות הוא מיוצר אוטומטית על סמך נתונים שאתה מכניס - גם הוא צריך לעמוד בסטנדרטים


וכמו שכתבתי בהתחלה אני כבר שנים לא נגעתי בטכנולוגיות האלו - לכן קח את הערות שלי בערבון מוגבל, יכול להיות שאני טועה
 
נערך לאחרונה ב:

אבי364

New member
תודה רבה על תגובתך. רשמתי לי את כל הדברים ואיישם אותם בראיונות הבאים שיהיו לי.
אני בוגר תואר בהנדסת חשמל ואלקטרוניקה ותכנות היה במהלך התואר משהו צדדי. אני מנסה לשפר את הידע שלי כדי להתמודד על משרות תכנות מול בוגרי מדעי המחשב.
אשמח להסבר על מה שכתבת בסעיף ד על הקוד " DllVer = FileVersionInfo.GetVersionInfo(CurrentFile).FileVersion;
אתה בטוח שכל גרסה של DLL חייבת להיות בפורמט הזה?
אז ככה , אני לא בטוח בכלל. זה משהו שמצאתי באינטרנט . אם זה בעייתי אשמח לדעת למה. תודה
 

randomUser432

New member
אז ככה , אני לא בטוח בכלל. זה משהו שמצאתי באינטרנט . אם זה בעייתי אשמח לדעת למה. תודה
הבעיה שעולה היא האם הפורמט שאתה מנסה לפרסר שם(4 מספרים שמופרדים בנקודות או פסיקים) הוא הפורמט המחייב על ידי מייקרוסופט?
אם לא וקיימות גם אופציות אחרות אז התוכנה שלך עלולה לקרוס(אם זה בגלל שתנסה לגשת לאיבר במיקום 4 במערך בגודל 1 או בגלל שתנסה להמיר אותיות למספר או כל סיבה אחרת).
הדרך הבטוחה במקרים כאלה היא ללכת לתיעוד של היצרן ולקרוא מה האפשרויות:
אז בתיעוד של FileVersionInfo.GetVersionInfo כתוב:
A FileVersionInfo containing information about the file. If the file did not contain version information, the FileVersionInfo contains only the name of the file requested.
כלומר יכול להיות שלא תקבל גרסה כי אין גרסה בקובץ ואז אתה כנראה תקרוס ובעצם עם המקרה הזה הקוד שלך לא מתמודד.
*יש עוד תיעוד רלוונטי באתר.

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

choo

Active member
מצורף עכשיו. סליחה
קוד:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DllSearcher
{
    public partial class edtDllFolderPath : Form
    {

        Dictionary<string, DllNotCompatible> NotValidDll = new Dictionary<string, DllNotCompatible> { };
        enum DllNotCompatible
        {
            Version,
            Date,
            Version_And_Date
        }
       
        public edtDllFolderPath()
        {
            InitializeComponent();
            InitDefaultValues();
        }

        private void InitDefaultValues()
        {
            txtMajorVer.Text = "1";
            txtMinorVer.Text = "0";
            txtBuildVer.Text = "6";
            txtRevision.Text = "8";
            textFilePath.Text = "c:\\temp\\Dll folder";
            this.Text = "Dll scanner system";
            dateTimePicker1.Value = new DateTime(2020, 10, 25);
            btnStartSearch.BackColor = Color.Yellow;
           

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string Dllver = "";
                string output = "";
                string CreatedDateStr = "";
                string details = "";
                if (Directory.Exists(textFilePath.Text) == false)
                {
                    MessageBox.Show("The folder " + textFilePath.Text + " is not exist");
                }
                else
                {

                    string[] ALLFiles = Directory.GetFiles(textFilePath.Text, "*.dll", SearchOption.AllDirectories);
                    foreach (string CurrentFile in ALLFiles)
                    {

                        CheckDll(CurrentFile, ref Dllver, ref CreatedDateStr);

                    }
                    foreach (KeyValuePair<string, DllNotCompatible> CurrentItem in NotValidDll)
                    {
                        switch (CurrentItem.Value)
                        {
                            case DllNotCompatible.Date:
                                details = "Dll created date is " + CreatedDateStr;
                                break;
                            case DllNotCompatible.Version:
                                details = "Dll ver is " + Dllver;
                                break;
                            case DllNotCompatible.Version_And_Date:
                                details = "Dll create date is " + CreatedDateStr + " and version is " + Dllver;
                                break;
                        }
                       
                       
                        output += "Dll path not valid " + CurrentItem.Key + " because " + details + "\n";

                    }
                    if (output == "")
                    {
                        output = "There is no dll that is not valid";
                    }
                    MessageBox.Show(output, "Not valid dlls");

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception while searching dll " + ex.Message + "\n" + "Please send screenshot of this error to admin");

            }
           
        }

        /// <summary>
        /// Verify if dll
        /// </summary>
        /// <param name="CurrentFile"></param>
        /// <returns></returns>
        private Dictionary<string, DllNotCompatible> CheckDll(string CurrentFile, ref string DllVer, ref string CreatedDateStr)
        {
            DateTime CreatedDate = File.GetCreationTime(CurrentFile);
            CreatedDateStr = CreatedDate.ToString();


            DllVer = FileVersionInfo.GetVersionInfo(CurrentFile).FileVersion;
            //default delimiter
            int major, minor, build, revision;
           try
            {
                major = (int)Convert.ToInt64(DllVer.Split('.')[0]);
                minor = (int)Convert.ToInt64(DllVer.Split('.')[1]);
                build = (int)Convert.ToInt64(DllVer.Split('.')[2]);
                revision = (int)Convert.ToInt64(DllVer.Split('.')[3]);
            }
            //in case dll seperate by point instead comma
            catch (Exception ex)
            {
                Console.WriteLine("try to divide by comma instead");
                 major = (int)Convert.ToInt64(DllVer.Split(',')[0]);
                 minor = (int)Convert.ToInt64(DllVer.Split(',')[1]);
                 build = (int)Convert.ToInt64(DllVer.Split(',')[2]);
                 revision = (int)Convert.ToInt64(DllVer.Split(',')[3]);
            }
           
           
            Version Dllversion = new Version(major, minor, build, revision);
            int Day = dateTimePicker1.Value.Day;
            int Month = dateTimePicker1.Value.Month;
            int Year = dateTimePicker1.Value.Year;

            DateTime DateLimitation = new DateTime(Year, Month, Day);
            TimeSpan difference = CreatedDate - DateLimitation;

           
            Version VersionLimitation = new Version((int)Convert.ToInt64(txtMajorVer.Text), (int)Convert.ToInt64(txtMinorVer.Text), (int)Convert.ToInt64(txtBuildVer.Text), (int)Convert.ToInt64(txtRevision.Text));
            if (Dllversion < VersionLimitation)
            {
               
               
                if (difference.Days >10)
                {
                    if (!NotValidDll.ContainsKey(CurrentFile)) NotValidDll.Add(CurrentFile, DllNotCompatible.Version_And_Date);


                }
                else
                {
                    if (!NotValidDll.ContainsKey(CurrentFile)) NotValidDll.Add(CurrentFile, DllNotCompatible.Version);
                }

            }
            else  if (difference.Days > 10)
                {
                if (!NotValidDll.ContainsKey(CurrentFile))  NotValidDll.Add(CurrentFile, DllNotCompatible.Date);
            }
           
            return NotValidDll;
        }

     
    }
}
כמה נקודות:

א. אתה החלטת שזו צריכה להיות תוכנת GUI, או שהם אמרו לך את זה? הם קראו לזה scanner - מה שמרמז לכוונה אחרת. במקומך - הייתי שואל את המראיין מהי כוונת המשורר. בנוסף, העובדה שדחפת MessageBox וערבבת בין הקוד שמנהל את ממשק המשתמש לבין הלוגיקה בכל מקום- מאוד צורמת - זה אומר שהקוד לא מודולרי, ואי אפשר יהיה להעביר אותו לשימוש תחת תנאים אחרים. במקומך הייתי כותב את הקוד כך שמכל המקומות תוחזר שגיאה מתאימה החוצה, ולכל היותר הופך את זה ל-MessageBox במקום אחד בפונקציה הראשית, ומפריד לחלוטין בין ה-class שיורש מה-Form לבין הלוגיקה של הקוד (את הלוגיקה הזו הייתי שם מחלקה אחרת שאין לה שום קשר לממש המשתמש).

ב. ראה את ערימת ההערות הנקודתיות שכתב לך randomUser432. במיוחד חוסר העקביות מעיד על אחת מהשתיים - או על זילזול מצידך, או על חוסר בשלות.

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

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

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

ו. כל שורות ה-using בהתחלה - זה קוד שאתה כתבת, או קוד שנוצר אוטומטית על ידי GUI builder? כי על פניו נראה שלפחות חצי מהם כלל לא רלוונטיים לקוד שכתבת.
 
ד. אתה מגדיר משתנה מילון בתוך הגדרת המחלקה - זה הופך את המחלקה בהגדרה לסינגלטון - לא ניתן יהיה לייצר מספר אובייקטים מתוכה במקביל - כי כולם ידרסו את המילון המשותף.

נשמע לי קצת מוזר. לא לכל אובייקט יהיה מילון משלו? זה לא static.
 

jellymean

New member
לכותב השאלה, יתכן שהפתרון שלך גרוע ויתכן גם שמישהו קיבל מתנה בחינם והסתפק בכך.
 

ShadowKit

New member
למה שלא תשאל את החברה? ממילא נדחית, אין הרבה מה להפסיד
 

אבי364

New member
אמרו לי "קוד ברמה נמוכה". שאלתי "מה בדיוק כתוב לא טוב" ? ואמרו "עזוב " ואז ניתקו לי...
 

ShadowKit

New member
אמרו לי "קוד ברמה נמוכה". שאלתי "מה בדיוק כתוב לא טוב" ? ואמרו "עזוב " ואז ניתקו לי...
וואט...
אני רק אגיד שניצלת מחברה נטולת יחסי אנוש באופן מחריד. מזעזע שיש מקומות שמרשים לעצמם להתנהל ככה, אם אתה יכול, בבקשה תזהיר אנשים מהם באופן אנונימי באתרים כמו The Worker ו-Glassdoor. אלו בדיוק המקומות לכתוב את התרשמותך מהחברה.
 

Nuke1985

Active member
זה חתיכת דגל אדום (וכנראה סיבה מספיק טובה לא להגיש בקשה לעבוד שם שוב), אתה ייכול לנסות לבדוק את הקוד כדי לשפר כישורים (כנראה שפורום בחו"ל של C# יהיה מקום יותר טוב), אבל לא הייתי מתבאס יותר מדי .
 

קלייטון.ש

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

אבי364

New member
כמה נקודות:

א. אתה החלטת שזו צריכה להיות תוכנת GUI, או שהם אמרו לך את זה? הם קראו לזה scanner - מה שמרמז לכוונה אחרת. במקומך - הייתי שואל את המראיין מהי כוונת המשורר. בנוסף, העובדה שדחפת MessageBox וערבבת בין הקוד שמנהל את ממשק המשתמש לבין הלוגיקה בכל מקום- מאוד צורמת - זה אומר שהקוד לא מודולרי, ואי אפשר יהיה להעביר אותו לשימוש תחת תנאים אחרים. במקומך הייתי כותב את הקוד כך שמכל המקומות תוחזר שגיאה מתאימה החוצה, ולכל היותר הופך את זה ל-MessageBox במקום אחד בפונקציה הראשית, ומפריד לחלוטין בין ה-class שיורש מה-Form לבין הלוגיקה של הקוד (את הלוגיקה הזו הייתי שם מחלקה אחרת שאין לה שום קשר לממש המשתמש).

ב. ראה את ערימת ההערות הנקודתיות שכתב לך randomUser432. במיוחד חוסר העקביות מעיד על אחת מהשתיים - או על זילזול מצידך, או על חוסר בשלות.

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

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

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

ו. כל שורות ה-using בהתחלה - זה קוד שאתה כתבת, או קוד שנוצר אוטומטית על ידי GUI builder? כי על פניו נראה שלפחות חצי מהם כלל לא רלוונטיים לקוד שכתבת.
תודה רבה על ההערות !
 

BravoMan

Active member
ראשית, הרשה לי להמליץ לך על 2 אתרים:
זה אתר מאותה חברה שמנהלת את SO, ושם תוכל לפרסם תוכנות קצרות כגון זו שהצגת כאן, או אפילו פונקציות בודדות עם אלגוריתם כדי לקבל משוב על איכות ונראות הקוד כמו גם הצעות לשיפור.

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

מעבר לזה, צר לי, אבל הדחייה המהירה, והסיבה שניתנה כולל חוסר הרצון לפרט, די מובנים לי, ואסביר:
בדרישה שהצגת, חוזרים פעמיים על שם התוכנה שהם רוצים שתפתח: DLL scanner
אבל, השורה הראשונה בקוד שלך (אם לא סופרים את כל ה-using) היא: namespace DllSearcher

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

ברשותך, מספר שאלות:
1. האם היית דרישת ניסיון תכנות בתיאור משרה, ואם כן לאיזה וותק הם ציפו?

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

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

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

4. האם קימפלת והרצת את הקוד?
בדקת שהוא עובד, מטפל במקרי קצה ומציג תוצאה נכונה?

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

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

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

ShadowKit

New member
ראשית, הרשה לי להמליץ לך על 2 אתרים:
זה אתר מאותה חברה שמנהלת את SO, ושם תוכל לפרסם תוכנות קצרות כגון זו שהצגת כאן, או אפילו פונקציות בודדות עם אלגוריתם כדי לקבל משוב על איכות ונראות הקוד כמו גם הצעות לשיפור.

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

מעבר לזה, צר לי, אבל הדחייה המהירה, והסיבה שניתנה כולל חוסר הרצון לפרט, די מובנים לי, ואסביר:
בדרישה שהצגת, חוזרים פעמיים על שם התוכנה שהם רוצים שתפתח: DLL scanner
אבל, השורה הראשונה בקוד שלך (אם לא סופרים את כל ה-using) היא: namespace DllSearcher

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

ברשותך, מספר שאלות:
1. האם היית דרישת ניסיון תכנות בתיאור משרה, ואם כן לאיזה וותק הם ציפו?

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

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

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

4. האם קימפלת והרצת את הקוד?
בדקת שהוא עובד, מטפל במקרי קצה ומציג תוצאה נכונה?

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

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

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

BravoMan

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

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

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

אבי364

New member
1. יד דרישה לנסיון. ואמנם יש לי נסיון של 7 שנים באוטומצייה.
2. האפיון ששמתי כאן זה האפיון המלא. כששאלתי להסבר על האפיון נעניתי ב" תקח את זה למקומות שנראה לך"
3. יש מגבלת זמן של 36 שעות למימוש. הבעייה שאני עובד תוך כדי ( 10 שעות ביום ) והסידורים \ קניות \ עזרה לילדים בש.ב גוזלים לי את שאר שעות היממה. לתרגיל התפניתי ב23:00 בלילה
4. קמפלתי והרצתי את הקוד. לא לקחתי בחשבון dll שלא בפורמט של פיצול לפני נקודות או פסיקים.
5. לקחתי ערכי ברירת מחדל שרירותיים. קבעתי ערכים כדי שיהיה סוג של דוגמה מה הinput שמצופה מהמשתמש.
 
למעלה