Why some professional certifications are not trustworthy in some countries?

Read the original article I wrote in LInkedIn here.

I was in a brainstorm meeting to design a new training program for developers, and one suggestion was to have a mandatory certification as part of evaluation criteria. Most of us were not in agreement with the idea but a justification comment from one person caught my attention “certification exams are just memory tests!“.

Microsoft do not conduct Beta exams in few countries and it is clearly mentioned in the About page of Microsoft’s Certifications:

Candidates located in China, India, Pakistan, or Turkey are not eligible to participate in beta exams for security reasons.

In one of the Microsoft Community forums, a Microsoft agent even shown the courage to explain the reason that the fraud percentage in these countries are almost 80%. (sorry, I am unable to trace that page now. May be that comment was removed after some reporting)

“Certification in X is preferred” is one of the usual line in Job Descriptions, but the fact is interviewer do not really give a damn about the certification unless the candidate really showcases the skills. This fate definitely is not applicable for all the exams, I have to admit.

I took my PMP exam at an exam center Dubai, UAE where I felt like I was in a demilitarized zone where I am being monitored by ‘someone’ every microsecond. I was allotted a locker where I was asked to put all the belongings including my watch and belt there and I had to walk though a scanner. I was guided to a cubicle where an overhead CCTV camera was pointing at me like a gun. After about three months of study by spending almost 4-6 hours a day, I also practiced the exam by answering about 1000 questions to get confidence. Surprisingly I did not encounter same question repeated in my actual exam and, the amount of joy I felt when the last screen of “Congratulations” gave was very blissful.

Compared to my PMP, back in my home town, the few other exams I took (mostly Microsoft exams) at local exam centers were very casual. No strict checking of body or ID card, nobody to monitor, no strict adherence to timing etc.

But why?

When I say “certification exams are for testing memory”, what I am trying to imply is that, you get “brain dumps“, the exact exam questions and its answers in your hand in advance so your job is just to memorize those questions and answer options so you might even get 1000/1000 marks.

One of the problem with local exam centers is, along with exam vouchers selling and facilitating the exams, they are also giving, or selling brain dumps too. They use some kind of screen recorders, or other methods to collect questions. There are many people in social media like Telegram, through the exam preparation groups are giving/selling same. But now since the exam providers also allow candidates to attend exams from anywhere, it has become too easy to cheat the exam by collecting questions, or by using another methods like impersonation. There are many websites also provide brain dumps, in the name of practice questions.

See how easy is it to write a program to take screenshot every few seconds so that you can do a second attempt exam by memorizing these questions:

System.Drawing.Rectangle captureRectangle = Screen.AllScreens[0].Bounds;

System.Drawing.Graphics captureGraphics = System.Drawing.Graphics.FromImage(bmp);

captureGraphics.CopyFromScreen(captureRectangle.Left, captureRectangle.Top, 0, 0, captureRectangle.Size);

bmp.Save(path + “\\” + DateTime.Now.Ticks + “.mib”, System.Drawing.Imaging.ImageFormat.Jpeg);

Another cheating method is to use a ‘proxy’ person support. Using some screen sharing software, your friend/proxy can login to your machine remotely and attend the exam while you sit idle in front of the computer.

How to make these exams trustworthy?

Exam process and systems are improving and embracing latest technologies. With the introduction of AI, there are effective solutions available which will monitor candidate’s facial movements, eye contact, body language etc. in addition to improving the exam quality – by intelligent selection of questions or alternate evaluation methods. Also, in addition to multiple choice questions, if we can introduce practical-oriented exams also, then we can make the candidates ready for the industry. Scenario based questions do exist, but those are again memoizable. However, we might have to wait a while more because, at the time of writing this exam also, I can see there are exams which you can easily pass if you have the capability to memorize brain dumps.

Getting myself introduced to Azure Synapse Analytics

This week I got an opportunity to be part of the program “Analytics In A Day”, organized by my employer, Orion Innovation. This is a one full-day workshop by Microsoft, delivers through their partners and target audience is usually technology leaders, architects, managers and developers. I have experience with various components of Azure Synapse Analytics individually such as ADF/Azure Data Factory, Azure SQL Data Warehouse, Databricks and DataLake but it is a very nice experience working with a unified platform which provides seamless integration, or in other words – each stakeholders: Data Scientists, Analytics, Architects, Business users and IT guys gets the relief of having bothered only about the area they really have to bother about, such as: Data Scientist can focus on his data and models and don’t worry anymore about how he/she can bring the data inside the tool. The program starts with data sources, and talks about the ingestion, processing storage, machine learning and visualization.

I was previously part of “DIAD aka Dashboard In A Day” also, which is all about preparing reports and dashboards in Power BI stack.

Microsoft's Azure Synapse Analytics bridges the gap between data lakes and  warehouses | TechCrunch

Strong Password Generator in C#

This code snippets will let you auto-generate strong passwords. Look for the password rules in the inline comments in code

001 using System;
002 using System.Collections.Generic;
003 using System.Linq;
004 using System.Security.Cryptography.X509Certificates;
005 using System.Text;
006 using System.Threading.Tasks;
007
008 namespace PwdGen
009 {
010     class Program
011     {
012         static void Main(string[] args)
013         {
014             //Console.WriteLine(GeneratePassword2(8, 15));
015             //Console.WriteLine(GeneratePassword(8, 15));
016             Console.ReadKey();
017         }
018
019         static string GeneratePassword2(int MinLengthint MaxLength)
020         {
021
022             string ValidChars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:;<>|=.,_-~!?&%@#$£€°^*§()+[] ";
023             string SpecialChars "!@#$%^&*()";
024             
025             string pwd string.Empty;
026
027             do
028             {
029                 Random rnd = new Random(Guid.NewGuid().GetHashCode());
030                 pwd string.Join(string.Empty, Enumerable.Repeat(ValidCharsrnd.Next(MinLengthMaxLength 1)).Select(=> s[rnd.Next(s.Length)]).ToArray());
031                 Console.WriteLine(pwd);
032             } while (
033
034                 Regex.Match(pwd"[a-zA-Z]{3,}").Success || // Not more than 3 chars in sequence
035                 Regex.Match(pwd, @"(\w)\1{2,}").Success || //Same number should not repeat more than 2 times
036                 Regex.Match(pwd"[1-9]{3,}").Success ||    // Not more than 3 numbers in sequence
037                 !Regex.Match(pwd"[A-Z]").Success ||       // At least one upper case char
038                 !Regex.Match(pwd"[a-z]").Success ||       // At least one lower case char
039                 !Regex.Match(pwd"[1-9]").Success ||         // At least one number
040                 (pwd.ToArray().Where(=> SpecialChars.ToArray().Any(l2 => l2 == l)).Count() == 0// At least one pre defined special char
041                 );
042             
043             return pwd;
044         }
045
046         static string GeneratePassword(int MinLengthint MaxLength)
047         {
048             string ValidChars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:;<>|=.,_-~!?&%@#$£€°^*§()+[] ";
049             string SpecialChars "!@#$%^&*()";
050             
051             string pwd string.Empty;
052
053             Random rnd = new Random(Guid.NewGuid().GetHashCode());
054             
055             bool NumExist false;
056             bool IsUpper false;
057             bool IsLower false;
058             bool IsSplChr false;
059             bool NoRepeat true;
060             bool NoSeq true;
061
062             while ((!NumExist || !IsUpper || !IsLower || !IsSplChr) && (NoRepeat || NoSeq) )
063             {
064                 NumExist false;
065                 IsUpper false;
066                 IsLower false;
067                 IsSplChr false;
068                 NoRepeat true;
069                 NoSeq true;
070                 
071                 pwd string.Join(string.Empty, Enumerable.Repeat(ValidCharsrnd.Next(MinLengthMaxLength 1)).Select(=> s[rnd.Next(s.Length)]).ToArray());
072                 for (int i 0pwd.Lengthi++)
073                 {
074                     // Contains at least 1 lower case letter and 1 upper case letter (all UTF-8), at least 1 number
075
076                     if (!NumExist)
077                     {
078                         NumExist = (char.IsDigit(pwd[i]) && true);
079                     }
080                     if (!IsUpper)
081                     {
082                         IsUpper = (char.IsUpper(pwd[i]) && true);
083                     }
084                     if (!IsLower)
085                     {
086                         IsLower = (char.IsLower(pwd[i]) && true);
087                     }
088
089                     // A predefined set of special chars must be present
090                     if (!IsSplChr)
091                     {
092                         IsSplChr = (SpecialChars.IndexOf(pwd[i]) >= 0);
093                     }
094
095
096                     // Not more than 2 identical characters in a row (e.g., 111 not allowed)
097                     if (pwd.Length && NoRepeat)
098                     {
099                         NoRepeat = !((pwd[i] == pwd[1]) && (pwd[i] == pwd[2]));
100                     }
101
102                     // Not any sequence of the English alphabet / numbers (above 3 letters)
103                     if (pwd.Length && NoSeq)
104                     {
105                         NoSeq = !((pwd[2] - pwd[1]) == (pwd[1] - pwd[i]));
106                     }
107                     Console.WriteLine(!NumExist +" "+ !IsUpper " " + !IsLower " " + !IsSplChr " " +  NoRepeat +NoSeq);
108                 }
109                 
110             }
111             
112             return pwd;
113
114         }
115     }
116 }
117

View in GitHub | Made with wp-showgithubfile plugin