Sunday, December 24, 2023

 

How to interview your interviewer

7 Things to Ask in a Software Developer Interview 

Interviewing is a two-way process, while your potential employer interviews you, you are also interviewing them. This guide is about the latter part, how to know whether this is the right company, the right team, and the right job for you.  While the focus of it is primarily on Software Developer interviews,  it can also be used in other Software/IT job interviews.

Of course, there are other factors for each individual before making a decision on an offer but these below are the ones  I have been using for myself (after checking company's product and mission) and I believe are the common ones to check for. 

 I group these into two categories: The things you need to observe and the things you need to ask about.

A) Things to observe during an interview


1. Quality of Questions

Are the interviewers asking high-quality questions ?

A good interviewer should try to assess what you have done in the past and what you bring to the table based on your past work. If you used Oracle as a developer you should be able to pick up SQL Server in a few weeks or if you used  AWS lambda then should be able to switch to Azure functions in a fairly short amount of time. If they ask too specific questions that should raise a question mark

Interview nowadays
byu/C0deSlinger inProgrammerHumor
The quality of the questions also directly signals the skills of the interviewers with whom you most likely will work in the same team.  There might be exceptions to this in some large companies where most of the interviewers will not work with you but that doesn't change the fact that the quality of the questions shows the quality of the engineering in the company (in case you care).
Also if you get the same questions repeatedly that shows the lack of coordination in the hiring team.

2. Quantity of Questions

If you know your stuff the more questions asked by the interviewer the better, this will improve the connection between you and your future employer.  And if you start your future job with a strong team connection you will hit the ground running and make significant contributions sooner in your new role. If you don't know your stuff I suggest to learn it

If interviewers can continue asking high-quality questions that shows that they know what they are doing,  but if you are asked only a few questions during the interview process that usually  indicates one of two things :

a) The interviewers don’t have the skillset to assess your skillset, this might be simply because they are newly adapting the tech stack they plan to use themselves or they don't know what they are doing

b)  They already know your work from another source (either positively or negatively)

3. Body Language and Attitude

I recommend reading about the body language and observing interviewers. That will help to assess a few important data points.  

Was the hiring manager among the interviewers? If not why? Did you feel connected to the interviewers when talking to them, especially the hiring manager? Ask yourself the question of how they made you feel?  Did you feel a lack of empathy ? 


B) Questions to clarify : 


4. Modernity of the Tech Stack

This is something you should ask the interviewers: What tech stack they are on? Are they still on VB6?  Do they have automated tests? 

 You may feel comfortable working on a dying tech stack but you should consider the opportunities you will miss in the future because you didn’t gain experience in the new technologies.

5. The quality of the code base:

No one wants to work on an undocumented, spaghetti code base. Did the team use SOLID, DRY or similar principles to create it? How is the onboarding process for developers? What kind of Tech Debt is there? How much of the team capacity in the past year is used to resolve the Tech Debt? Does the codebase have high code coverage?  If you really enjoy writing code, then the lack of the 3+ items from the above list will make your life difficult.


Another.

byu/amjh in ProgrammerHumor


6. The Process:

Which SDLC methodology do they follow? What practices are mandatory in software development?

Do they require a lot of documentation? Some regulated environments require you to write one line of documentation for every line of code. Are you ok with that?  Does the team have a product manager? 

A lot of the companies state that they are following Agile but everyone has a different version of it. 


Are you able to use the tools you want easily, or will it take 6 months to get it approved by the IT department? And if so are you fine with that? In startups, this process is usually quick but in regulated environments, it may take months. 

7. The Team

You can ask about the team culture, how long have the interviewers been with the company? How do they like it there?   Is it remote first, hybrid, or fully onsite?  Do they have team gatherings or team-building activities? Do they care about their employees? How is the WLB?

Conclusion

Keep in mind most of the interview decisions are made by a team to hire the right candidate, and it's very common that the decision is not unanimous. Some of the interviewers might have given you thumbs up but some haven't.  You should do the same and use multiple data points to decide before accepting an offer


Oguz Altuncu is a NY Metro based Software Engineering leader with 20 years of experience in the field 

Sunday, May 12, 2019

VS 2019

This version of VS looks really good, its super fast almost as fast as VS Code .

Sunday, November 12, 2017

Javascript & Asynchronous programming

Async programming in Javascript 

Asynchronous programming provides superior performance compared to synchronous programming. 
And with the promises it's now very easy to do async programming in ES6.

Whats Is Really Async Programming ?

A good analogy to describe what async programming is ,  would be:
We have  a cook who doesn't start any  task before the previous task is finished . He gets a pizza order and then a french fries order. After he prepares the pizza and puts it into the oven he doesn't do anything until pizza is baked, which means he has a lot of idle times between tasks . This is synchronous way of working.

On the other hand we also have an async cook  who uses timer for  tasks and keeps switching between tasks to prevent idle time , he prepares the pizza into the oven, in the mean time he puts the french fries into the fryer and so on.

Obviously async cook will be utilizing his time much more efficiently and finishing  orders much quicker.
Sync Cook :
|Make pizza|Fry French Fries|Cook Omelette|
Async cook:
|Make pizza|Cook Omelette|
   |Fry French Fries

In programming we use async programming technique  to utilize idle time which happens during a  time consuming task, this task can be calls to web services or databases or something else .
During the async call  we can do other things until the result comes back, the execution flow will not be  blocked (unlike sync calls). All this can be done using promises.
Below is a sample javascript code which is using then() function (that's how we consume promises).(Here you need to send  your own API Key as "APPID" , which you can get for free from https://openweathermap.org/api.)
1:   var url = "http://api.openweathermap.org/data/2.5/";  
2:    var city = "New York";  
3:    var appID = "XX";  
4:    var commonParam = "?APPID=" + appID + "&q=" + city + "&units=imperial";  
5:    var urlWeather = url + "weather" + commonParam;  
6:    var promiseToCallWeatherApi = $.ajax({  
7:      url: urlWeather, dataType: 'json'  
8:    });  
9:    promiseToCallWeatherApi  
10:      .then(function (resultWeather) {  
11:        console.log("Temperature is: " + resultWeather.main.temp);  
12:      })  
13:      .catch(function (err) {  
14:        console.log("An error occurred getting weather info" + err);  
15:      })  
16:    console.log("Getting weather info..");  

The code calls a web service which provides weather info (line 9)
The response can  take less than a second time and in the mean time we want to show some message on the screen(line 16) and finally we want to show the result when it comes back (line 11). And if the call fails we want to show an error message (line 13-15)
Below is the result screen:
As mentioned above async call  did not  block the execution and that's why the "Getting weather info" is displayed first which means line 16 is executed before the entire block of 11-14. First it made the api call on line 9, then executed line 16 , waited for the result and displayed the result after its done (line 11).

We can also chain multiple then () functions, which basically means : do this, then this then that..


1:    var url = "http://api.openweathermap.org/data/2.5/";
2:    var city = "New York";  
3:    var appID = "xx";  
4:    var commonParam = "?APPID=" + appID + "&q=" + city + "&units=imperial";  
5:    var urlWeather = url + "weather" + commonParam;  
6:    var promiseToCallWeatherApi = $.ajax({  
7:      url: urlWeather, dataType: 'json'  
8:    });  
9:    promiseToCallWeatherApi  
10:      .then(function (resultWeather) {  
11:        console.log("Temperature is: " + resultWeather.main.temp);  
12:      })  
13:      .then(function (result) {  
14:        console.log("Enjoy the weather!");  
15:      })  
16:      .catch(function (err) {  
17:        console.log("An error occurred getting weather info" + err);  
18:      })  
19:    console.log("Getting weather info..");  
The result is:

We can also make multiple api calls:
1:   var urlForecast = url + "forecast" + commonParam;  
2:    var promiseToCallWeatherApi = $.ajax({  
3:      url: urlWeather, dataType: 'json'  
4:    });  
5:    var promiseToCallForeCastApi = $.ajax({  
6:      url: urlForecast, dataType: 'json'  
7:    });  
8:    promiseToCallWeatherApi  
9:      .then(function (resultWeather) {  
10:        console.log("Temperature is: " + resultWeather.main.temp);  
11:      })  
12:      .then(function (result) {  
13:        return promiseToCallForeCastApi;  
14:      })  
15:      .then(function (resultForeCast) {  
16:        console.log("Forecast's first result is:" + JSON.stringify(resultForeCast.list[0].main));  
17:      })  
18:      .catch(function (err) {  
19:        console.log("An error occurred getting weather info" + err);  
20:      })  
21:      .then(function (result) {  
22:        console.log("Enjoy the weather!");  
23:      })  
24:    console.log("Getting weather info..");  

The result is as below:
In the above I had to return the result of the call in line 13 so that the next then() function in the chain (line 15) will get the result as a parameter(resultForeCast).

The catch block above is applicable to both the then() functions . 
 So to identify where the error happened you can create some if else statements  inside the catch block and handle different type of errors .

Monday, May 29, 2017

To AWS or not to AWS

Everyone is talking about moving to cloud these days for a good reason. Who wouldnt want to be serverless and having autoscaling servers , lowering the cost of all the licencing  and maintenance. And in fact not doing any maintenance and delegating that task to a PaaS/IaaS company.

AWS is the leading PaaS in the market offering over 60+ services along with it.
AWS platform includes  own queue service, own RDBM, own NoSQL db, even their own source control applications, project management tools .. .
And if you ask an Amazon rep, they would suggest to move alltogether to these services rather than just using AWS as a PaaS or IaaS.
But are all of the AWS services real good?
Why would I prefer DynamoDB over Mongo or any other NoSQL?
Why would I prefer TFS to CodeStar or whatever AWS Project management CI tool ?

I wanted to do a small research on these and here is a brief summary.
Lets look at those "services":

First of all all these services are pretty new, and everyone knows it takes many years to have a software mature , and at the moment none of these services are the leading software in the respective arena,
Aurora is not #1 in RDBM, DynamoDB is not # 1 in NoSQL arena, neither Redshift in the OLAP world.

And the fact is many of these AWS applications are modified versions of some Open Source software:
Aurora - Fork of MySQL(Amazon claims that Aurora is 5 x faster than MySQL)
Redshift - Fork of Postgre 8
ElasticCache- Using Redis and Memcached nothing really new
When you look at these services with their unmodified original versions yes many of them are quite popular.


The race to to dominate the Cloud market is going super fast and obviously Amazon doesnt want to reinvent the wheel in that race so they are using the available Open Source software which is pretty realistic.

Yet I find it very unrealistic to switch to entire AWS services altogether at the moment because of the fact that it takes many years for any software to mature.

And I also think Amazon may be thin spreading by trying to create a service for anything, instead they can buy market leaders , like TeamCity for CI or JIRA .

Edit: Dynamodb is very limited compared to other nosql databases, the query syntax overcomplicated

Wednesday, January 04, 2017

ORM for SQLite

A great library which will save a lot of development efford
http://jaydata.org/

Friday, April 25, 2014

Getting Potential Reach for ReTweeted Tweets via Linq2Twitter

Linq2Twitter is a super awesome library to use the Twitter Api Thanks to the creator
I wanted to get all tweets and if retweeted , total count of followers of retweeters to see how many people each tweet reached.
And this is how you do it
public async static Task<List<Tuple<Statusint>>> GetTweetsWithReach(int schoolID, DateTime startDate, DateTime endDate)
{
    string twUrl;
    var auth = TWAuthenticate(schoolID, out twUrl);
    try
    {
        if (auth == nullreturn null;
        await auth.AuthorizeAsync();
        using (var twitterCtx = new TwitterContext(auth))
        {
            List<Status> tweets = await (from tweet in twitterCtx.Status
                                         where (tweet.Type == StatusType.User)
                                               && tweet.ScreenName == twUrl.GetTwitterUsername()
                                               //todo change 5
                                                && tweet.Count == 200
                                                // && tweet.RetweetCount > 0
                                                && tweet.CreatedAt < endDate && tweet.CreatedAt > startDate
                                                && tweet.IncludeRetweets == true
                                                && tweet.TrimUser == false
                                         select tweet).ToListAsync();
            var listTweets = new List<Tuple<Statusint>>();
 
            foreach (var tw in tweets)
            {
                int reach = 0;
                if ( tw.RetweetCount > 0)
                {
                    var reTweets = await (from tweet in twitterCtx.Status
                                          where tweet.Type == StatusType.Retweets && tweet.ID == tw.StatusID
                                          select tweet).ToListAsync();
                    if (reTweets != null)
                        reach = reTweets.Where(rt => rt != null && rt.User != null).Sum(rt => rt.User.FollowersCount);
                }
 
                listTweets.Add(new Tuple<Statusint>(tw, reach));
            }
            return listTweets;
        }
    }
    catch (Exception ex)
    {
        ex.LogException(twUrl.GetTwitterUsername() + "twitter error");
        return null;
    }
}

Wednesday, April 09, 2014

Reading json easily with C#

You need Newtonsoft.Json dll and use of "dynamic" type in C# to do below.
This code gets follower count from Twitter api without the need to create extra classes
to load json data  : 
 
var wc = new WebClient(); 
string json= wc.DownloadString(url);

         dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json); 
        int? twFollowerCount =obj.followers_count;

Wednesday, January 22, 2014

Chronicles on Migration From Entity Framework to Telerik OpenAccess - 4: Exception with OpenAccessLinqDataSource causes the page to hang forever

You need to add this line to wherever the exception occurs:
         e.ExceptionHandled = true;

    protected void edsSch_Deleted(object sender, OpenAccessLinqDataSourceStatusEventArgs e)
    {
        if (e.Exception != null)
        {
            ((RadNotification)Master.FindControl("rnMain")).Show("A problem occurred while deleting this  ");
            e.ExceptionHandled = true;         
        }

Thursday, January 16, 2014

Chronicles on Migration From Entity Framework to Telerik OpenAccess - 3

With entity data source you can bind it to a grid and do all CRUD operations automatically even if the entity data source selects related entities via "Include" property.
With Telerik OpenAccessLinqDataSource if you "include" related entities you can not use auto CRUD .You need to write custom code for CRUD

Telerik OpenAccessLinqDataSource gives "Identifier expected (at index 3)" exception Chronicles on Migration From Entity Framework to Telerik OpenAccess - 2

Use default value of where parameter to prevent this
  <telerik:OpenAccessLinqDataSource runat="server" ID="edsDegree"
        ResourceSetName="Degrees" EntityTypeName=""
        Select=" new (ID,DegreeTypeID,MajorType,MajorType2,MinorType,SectionID,College,PlannedEntryDate,EntryDate,PlannedGraduationDate,GraduationDate,GPA)"
        ContextTypeName="DataModel.data"
        Where="it.UserID==@UserID">
        <WhereParameters>
            <asp:Parameter Name="UserID" Type="Int32" DefaultValue="0" />
        </WhereParameters>
    </telerik:OpenAccessLinqDataSource>

Or

Remove the "[" "]" from the  markup:
OrderBy="it.[Name]" --> OrdeBy="it.Name"

Friday, December 06, 2013

Chronicles on Migration From Entity Framework to Telerik OpenAccess - 1


I have to replace all the EntityDataSources to OpenAccessLinqDataSource's(or the old OpenAccessDataSource)
So this below:
<asp:EntityDataSource runat="server" ID="edsDegree" ConnectionString="name=Entities"  
DefaultContainerName="Entities" EnableFlattening="False"
    EntitySetName="Degrees" Include="College,DegreeType,MajorType"
    EntityTypeFilter="Degree" Where="it.UserID=@UserID">
    <WhereParameters>
        <asp:Parameter Name="UserID" DbType="Int32" />
    </WhereParameters>
</asp:EntityDataSource> 
will become :
<telerik:OpenAccessLinqDataSource runat="server" ID="edsDegree"
    ResourceSetName="Degrees" EntityTypeName="" 
ContextTypeName="DataModel.data"
  Select=" new (PlannedGraduationDate,GraduationDate, College,DegreeType,MajorType)"
    Where="it.UserID=@UserID">
    <WhereParameters>
        <asp:Parameter Name="UserID" DbType="Int32" />
    </WhereParameters>
</telerik:OpenAccessLinqDataSource>
 
 
Neither of the telerik data controls have the "Include" property. So if the EntityDataSource is using it ,
you can Include your related entities as Select="new (ID,Name, ChildEntity )".In the above examples related entities of Degree entity are:
College,DegreeType,MajorType

Monday, December 02, 2013

Telerik OpenAccess include equivalent

  IQueryable<Customer> query = from c in dbContext.Customers.Include(c => c.Orders)
                                       where c.Country == "Germany"
                                       select c;

Check valid email in SQL Server

The only working answer below:
   
select * from users 
WHERE NOT
(     CHARINDEX(' ',LTRIM(RTRIM([Email]))) = 0 
AND  LEFT(LTRIM([Email]),1) <> '@' 
AND  RIGHT(RTRIM([Email]),1) <> '.' 
AND  CHARINDEX('.',[Email],CHARINDEX('@',[Email])) - CHARINDEX('@',[Email]) > 1 
AND  LEN(LTRIM(RTRIM([Email]))) - LEN(REPLACE(LTRIM(RTRIM([Email])),'@','')) = 1 
AND  CHARINDEX('.',REVERSE(LTRIM(RTRIM([Email])))) >= 3 
AND  (CHARINDEX('.@',[Email]) = 0 AND CHARINDEX('..',[Email]) = 0) 

http://stackoverflow.com/questions/801166/sql-script-to-find-invalid-email-addresses

Thursday, October 24, 2013

Friday, October 04, 2013

Creating/Running Telerik Reports in Visual Studio , in Design Time

I m using entity framework and getting the data for my Telerik report from it.
To see the reports running in the Visual Designer and avoid the error: "The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.", you have to hard code your connection string into the code and use the connection string while opening the connection as below:
        public static List<Region> GetRegions()
        {
            using (Entities entities = new Entities(connStr))
            {
                entities.Connection.Open();
                return entities.Regions.ToList();
            }
        } 
This won't work:
   public static List<Region> GetRegions()
        {
            using (Entities entities = new Entities())
            {
                entities.Connection.Open();
                return entities.Regions.ToList();
            }
        } 

Its against the best practise of course but to to see your reports running from Visual Studio 
,it's worth !

Wednesday, August 21, 2013

Disable Radbutton postback w/ validation

       function ValidateLastName(button, args) {
            var txtLastName = $find('txtLastName');
            if ( txtLastName.get_value() == '') {
                alert('At least lastname should be entered');
                button.set_autoPostBack(false);
            }
            else { button.set_autoPostBack(true); }
        }
 
           <telerik:RadButton runat="server" ID="btnLookup" OnClick="btnLookup_Click"  
Text="Lookup"  OnClientClicking="ValidateLastName">
                            </telerik:RadButton> 

Tuesday, August 13, 2013

EF , how to query result of query again

           var schools = entities.Companies.OfType<School>();
                if (hasHSAlumni)
                {
                    schools = (ObjectQuery<School>)schools.Where(p => p.HSGraduateExist == true);
                }

Thursday, August 01, 2013

Issue:Forms authentication doesnt allow images to show in IIS

     You already defined correct authentication like this:  <allow users="?" /> 
and IIS still doesnt show the images css or other resources
Solution: Edit Anonymous Authentication  and set it to Application Pool Identity






RadAsyncUpload too big

<style type="text/css">
 .RadUpload .ruFakeInput
 {
  height: 12px!important;
  width:60px!important;
 }
</style>