Quantcast
Channel: Infragistics Community
Viewing all 2223 articles
Browse latest View live

It’s show time! Infragistics is the exclusive sponsor of the MS Dev Show Podcast

$
0
0

Infragistics has always been an active member of the developer community, with the belief that sharing knowledge is vital part of bringing the community together and helping others. In keeping with that tradition, we are excited to announce that Infragistics is the exclusive sponsor of the MS Dev Show podcast!

If you are a .NET lover or a Microsoft technologies user, this is the podcast to have on your playlist. Covering the latest in Microsoft development news and trends, MS Dev Show has a diverse range of topics that will appeal to everyone, including:

C# Language and Future

Azure Data Lake

Developer Tools and Patterns

DevOps and Release Management

Enterprise Universal Apps

Hosts Carl Schweitzer and Jason Young keep the show fresh by inviting interesting guests who are experts in their fields. Carl, a Microsoft Windows Development MVP and Senior Software Engineer at Concurrency, Inc, has a diversified experience in a wide array of technologies utilizing Microsoft development platform. Jason, on the other hand, is a Principal Program Manager with comprehensive experience in software development, Information Technology management and executive leadership. So with all this expert insight, you know you’re in for some enlightening and entertaining discussions.

We’re huge fans of engaging ways of expressing ideas and sharing knowledge. And if you are too, be sure to follow all the action on MS Dev Show - you can subscribe via:

Or follow the show at:

The complete solution for any large-scale digital transformations, enterprise mobilization and modern UI initiatives. See what's new in Infragistics Ultimate 16.1!


Developer News - What's IN with the Infragistics Community? (5/9-5/23)

XLR8 Conference 2016 Recap

$
0
0

The past Saturday, 14 May 2016, Infragistics held its first XLR8 conference in Sofia, Bulgaria and judging by its success there will be many more to follow. JavaScript, Angular and Mobile dev skills were all accelerated by the leading minds in the field and as a bonus we also had a separate track for accelerating developers’ soft skills and design knowledge as well.

XLR8 logo

The day started with a beautiful morning and attendees filling the space as the networking started to gain speed. Meanwhile our great photographer (besides also being one of our talented Infragistics designers) Svilen Dimchevski was warming up with some creative shots like this one:

Morning networking

To boost the mood and start a day of insights and discussions, our own VP of Product Management, Community, and Developer Evangelism Jason Beres gave a brilliant keynote on mobile & IoT opportunities, the importance of embracing a UX-centered work process and the mobile state of the art in the enterprise world today. His intriguing talk got everyone’s attention that could be felt throughout the hall and confirmed by the feedback gathered following the event. Jason’s presentation received the highest ratings for his keynote! Our Infragistics star Jason rocked the stage yet another time!

Keynote by Jason Beres

After such an inspiring beginning, the attendees then continued to the other talks eager to learn more. The developers’ track was like honey to the bees in the face of the dev minds in the audience.

Dev track

Our own Infragistics leaders in the JS & Angular field started the track with the “Evolution of JS&Web – Past and Present Challenges” by Konstantin Dinev and “Angular 102” by Damyan Petev who also ran a live demo during his session.

Damyan Petev's live demo and Konstantin Dinev's session

Lunch time gave the attendees the opportunity to explore the car of the year and get massages in between expanding their networks of IT contacts.

Car of the yearNetworking

The afternoon continued to keep the developers’ interest with “Integrated Web Stack with Angular 2” by Minko Gechev, book writer and specialist in Angular 2, “Building Product Hunt for iOS” by Radoslav Stankov & Vladimir Vladimirov and the other star of the day (as shown by our feedback form) Martin Chaov with his talk on “Multithreaded JS Applications in the browser”.

Martin Chaov's talk

Parallel to all the code ingenuity happening next door, were the soft skills and design accelerator presentations. This track brought diversity and enrichment beyond the code for our attendees. The topics covered were “Programming yourself for success. Myth or reality?” by Magdalena Nikolova, an NLP specialist, followed by “Communications in Stressful Situations” by Simon Harris. The design tracks were in the hands of our Bulgarian Infragistics team of UXers, including myself. Spasimir Dinev enlightened the audience on how to optimize their mobile designs with his “Choose their destiny” talk. My turn came with “The WHYs and HOWs of including the users in the process” for which the little XLR8con birdy helped me to get people’s attention on key points by his little flute whistles:

XLR8 birdy

Ain’t he so darn cute? How could I have resisted his assistance (me being one of those crazy bird watching people)?

To end the track with grace and some cookies (!!) was Stefan Ivanov’s creative session on “Designing for Constrained Productivity” during which he cooked up for us (figuratively and literally!) some design cookies. What a tasty way to end the day :)

speakers-design-&-soft-skills-track

I want to thank everyone who took part in organizing this first edition of what will be a conference with accelerating success from year to year. We also want to thank our numerous attendees and sponsors without whom this conference would not have been possible. On a final note, congratulations to the lucky attendee who left with a brand new BB-8 Droid as their new self-minded buddy to play with at home!

IG team

Hope to see you next year, when the XLR8 conference will be even more acceleratingly fun and insightful.

9 Tips for Writing Secure Applications in ASP.NET

$
0
0

 

 

Security is one of the most important aspects of any application – and when we talk about security, particularly in ASP.NET applications, it is not limited to development. A secure app involves multiple layers of security in the configuration, framework, web server, database server, and more. In this post, we’ll take a look at the top nine tips for writing secure applications in ASP.NET.

 

1- Cross Site Scripting (XSS): This vulnerability allows an attacker to inject some malicious code while entering data. It could be JavaScript code, VB script, or any other script code.By default, ASP.NET MVC validates the inputs and throws a server error in case of script. Say we put the script in the input form:

 

 

 

When we submit the above page, we’ll get the error below:

 

 

By default, the razor view engine protects from XSS attacks. But there are certain scenarios (blogging, social applications, etc.) where we might need to allow html tags in input controls. For that, we have an option to add the ValidateInput filter as false:

 

 [HttpPost]

 [ValidateInput(false)]

  publicasyncTask<ActionResult> Register(RegisterViewModel model)

  {

       if (ModelState.IsValid)

       {

            //  Etc.

}

  }

 

But this is very risky because here we not validating the complete request. Say the model has twenty properties, all will be exempt from the validation while we might need to allow html in only one or a few controls.

 

In that scenario, instead of using this ValidateInput, we should put the an attribute AllowHTML in the specific ViewModel’s property as:

 

publicclassRegisterViewModel

    {

        [Required]

        [AllowHtml]

        [Display(Name = "User Name")]

        publicstring Name { get; set; }

       

    }

 

Now we can use tags for the name only.

 

2- Cross site resource forgery (CSRF):  CSRF (also known as one click attack) is a type of malicious attack where unauthorized commands are fired from a trusted website where the user is authenticated. In real world scenario, say the user logged into an application with windows/cookie based authentication. Now without logging out, the user visits a malicious site and clicks on a button. The external website initiates a request via your website for doing an unethical operation. It will be considered as valid request because the request is authenticated.

 

To prevent from CSRF attacks, MVC provides AntiForgeryToken mechanism. For that we need to use AntiForgeryToken helper in view as

 

  @Html.AntiForgeryToken()

 

And to validate the token, we need to put  Antiforgerytoken filter over action as:

     

[ValidateAntiForgeryToken]

      

 public async Task<ActionResult> Register(RegisterViewModel model)

{

      if (ModelState.IsValid)

      {

 

          // etc.

 

      }

 

      return View(model);

  }

 

It creates two tokens in response, one is set as a cookie and other is set in a hidden field as:

 

<form action="/Account/Register" class="form-horizontal" method="post" role="form">

     <input name="__RequestVerificationToken" type="hidden" value="Qorw9RPABdHoRC7AojnSnQYYuGZP5iPF63UFVSw_[…]" />

 

While submitting the form both of the tokens (cookie and hidden field) are sent to the server. Both are validated at the server, and  if either one is not present or tampered then the request is not allowed.

 

3- Handling Errors Properly: Errors are bound to happen, and they find their way to reach user. But if they are not handled properly, errors can leak internal information to the outside world, which can be a threat to the application. Following YSOD is common when an unhandled exception occurs:

 

 

But see how much information it is showing to outside world: internal code, physical file structure, stack trace, and the version of ASP.NET and .NET framework.

 

One quick fix could be setting customErrors mode on as:

 

<customErrorsmode="On">

</customErrors> 

 

This will show an ASP.NET default error page in case of each error. To handle it in better way, use custom errors mode RemoteOnly and have a common error page which gets displayed in case of error.

 

<customErrorsmode="RemoteOnly"redirectMode="ResponseRewrite"defaultRedirect="~/Error.aspx" />

 

Here we are displaying our own error page in case of an error.

 

4- SQL Injection: SQL injection is a well-known security vulnerability, but it is still not handled properly in many applications. SQL injection allows hackers to tamper with existing data, modify transactions, or even delete data or databases, which can be a major loss to business.

 

Using this technique, the hacker injects some malicious SQL commands via input. These commands have the power to change the SQL statement running on the server.  Say authenticating a user in an application, we have written a query in a class as:

 

"select * from Users where UserName='"+txtUserName.Text+"'and Password='"+txtPwd.Text+"' ";

 

Now user puts the following value in user name:

 

Now the query will be generated on server as:

 

select * from Users where UserName='’ or 1=1 --' and Password='"+txtPwd.Text+"' ";

 

This will always return items and allow users to get into the application.

 

To handle this, the best way is to use SQL stored procedure where we will pass the values a parameter or at least use the parameters as:

 

"select * from Users where UserName= @username and Password=@password”

 

5- Click-Jacking: Click-Jacking is another major vulnerability that gets ignored normally. In this, the attacker uses an opaque layer to trick the user to click on a button or link on different page (say transfer button on the bank website) while they are intended to click on the top level page.

 

To avoid this issue, we should not allow any website of different domain in iframe to open. To achieve this, we need to add a response header X-FRAME-OPTIONS as deny or sameorigin. In ASP.NET, we can set in Global.asax as:

 

void Application_BeginRequest(object sender, EventArgs e)

{

    HttpContext.Current.Response.AddHeader("X-FRAME-OPTIONS ", "DENY");

}

 

It will add the header in all the responses send by the application.

 

We can also use IIS to add the same header. In IIS, go to the intended website, and go to HTTP Headers tab and add a custom header with the header X-FRAME-OPTIONS as discussed. You will need to restart IIS to get it into effect.

 

6- Hide Application Structure/ Directory Listing– Would you like to share the folder structure of your application to the end user?  No! Right? Let’s see an example. I have deployed ASP.NET web forms default application on IIS so now when I access the URL, it displays:

 

 

 

It shows all the files and folders available under Account. This information can be a potential threat to the application if publically available.

 

Directory browsing should be disabled at IIS. When it is disabled, we see:

 

 

It returns 403 (forbidden), but that still leaves some vulnerability as it tells the user that this folder is available. When we try to access a directory which is not available, it returns 404.

 

For this, we can write our own custom http handler and configure it so that it always return 404 whenever anybody try to access a folder.

 

7. Encrypt sensitive information in Web.config– Many times we put critical information in the Web.config, most commonly the connection string.

 

To encrypt any part of connection string, we need to navigate to framework folder on command prompt (say C:\Windows\Microsoft.NET\Framework\v4.0.30319 ) and run the following command:

 

aspnet_regiis -pef "connectionStrings" path

 

Here path is the path of the folder where Web.config resides. After running the command, it shows as:

 

 

 

Similarly we can encrypts other section like <appsettings> etc.

 

7– Secure the cookies: Cookies are small text stored by browsers on users’ machines that travel between the web server and browser. Cookies are used to store the user related information for the specific website. In ASP.NET, Session Id is one of the most common pieces of information for which cookies are used to save.

 

As this information is stored in plain text on a user’s machine, it could be an easy target for attackers. There are couple of steps we need to take to avoid storing data in cookies, such as setting an expiry date and encrypting the data. Apart from these two steps, there are two more things which we should do:

 

1-      Allow cookies on SSL only

2-      Set the cookies as HTTPOnly. This makes sure that cookies cannot be read by client side script so our session or Form authentication token could not read on a browser.

 

We can make the settings in Web.config as:

 

<httpCookies domain="String"

             httpOnlyCookies="true "

             requireSSL="true " />

 

8- Encrypting View State- View State is one of the most common techniques used to maintain the state between the Page PostBacks in ASP.NET Web forms. View State is saved in a hidden variable on the page with id __VIEWSTATE. When we see that in view source, we find that it contains a series of numbers and characters. Be sure that it is not encrypted but in base64 format. Anybody can decode it to read the information.

 

There are two options to encrypt and make it tamper proof. There is the property ViewStateEncryptionMode, which can be set at page level in the aspx file or can be set it in Web.config which applies to all the pages in the application. It encrypts the view state before putting it into the response. Similarly, another property, EnableViewStateMac, can be set as true at the page or in Web.config. It creates a hash of the view state content and added in the hidden field. In the next post back, again the hash gets created and verified. If it does not match, then post back is rejected and an error is thrown.

 

9- Remove sensitive information from Response Headers: Here is the response header of a page of an ASP.NET application:

 

Here we can see that it is revealing too much information to the end user, which they don’t require like in IIS version, site built on, and ASP.NET version. If an attacker knows the loopholes of any of them, he or she can exploit the vulnerability. This information is by default added, and we should remove it unless and until specifically required.

 

a-      To remove ASP.NET version header, we just need to add the following in the Web.config:

 

<system.web>

  <httpRuntime enableVersionHeader="false" />

</system.web>

 

b-      To remove MVC version, we need to go AppliCation_Start event in Global.asax and add the following code:

 

MvcHandler.DisableMvcResponseHeader = true;

 

c-       X-Power-By is added by IIS and can be removed by adding the following configuration:

 

  <system.webServer>

        <httpProtocol>

            <customHeaders>

                <removename="X-Powered-By" />

            </customHeaders>

        </httpProtocol>

  </system.webServer>

 

Conclusion: In this post, we discussed that security is key for any web application, and if not handled properly, it can harm the business significantly. We discussed nine of the most common vulnerabilities of ASP.NET web applications and saw that most of these can be fixed by making some configuration change or minor code changes.

 

Build full-featured business apps for any browser with Infragistics ASP.NET controls! Download Free Trial now.

 

The Importance of Prose in Communicating Data

$
0
0

If you're a data communicator, having a good understanding of chart and table design is important. Thankfully, the art and science of creating effective charts and tables is the subject of a great number of books. (One of my favorites is Stephen Few's Show Me the Numbers.) This doesn't, however, mean that how we use ordinary prose - spoken or written - should be ignored.

About a year ago I wrote an article here titled "7 Do's and Don't of Dataviz". The first of those seven things was "Don’t use a chart when a sentence will do". Ryan Sleeper takes the opposing view in this article:: "Even when the numbers are in units, you can likely tell that the first number is smaller than the second number, but it is challenging to consider the scale of the difference."

I'm not convinced by this argument for written text if the numbers are formatted consistently, with commas (or points) as thousand separators. The varying number of digits and separators make it fairly obvious when numbers differ by a couple of orders of magnitude. (Aside: this is also why you should right-align numbers in tables (or align on the decimal point where possible and applicable).)

Better still, with written prose we can be explicit about large differences: "Value 1 (4,500,000) is 150 times larger than value 2 (30,000)." In a single sentence we have expressed a pair of values precisely and provided a simple comparison that is really easy to understand: the first entity is 150 times the size of the second.

Even if you don't like the use of parentheses or you don't want to type out all the 0's in 4,500,000 there are plenty of other ways to create a sentence that clearly conveys the difference between two very different numbers. In most cases you'll probably be looking at real entities or concepts rather than completely abstract numbers so we'll imagine a scenario: "With a salary of $30,000, Bob would have to work for 150 years to earn the $4.5 million that Aaron earns in just one twelve-month period." While you can see there's a massive difference between the wages of Aaron and Bob in the bar chart below, it's pretty tough to get the factor of 150 from comparing the lengths or end-points of the bars alone. You might think "Wow, Aaron earns a lot more than Bob" but you're unlikely to get the bit where it'd take Bob a century and a half to earn as much.

Of course, neither the descriptive sentence nor the bar chart tell us anything about why Aaron earns so much or why Bob's salary is more modest. Neither really tells us why we should care either. Two numbers are different. So what?

Well there might be a good story in the difference. They could be twins or friends who made slightly different life choices with huge consequences. Or we could "just" be comparing a company CEO and someone further down the company's pyramid. As I keep saying, context is key when it comes to conveying data. Even if you really insist that your two data points require a chart, chances are that to convey the proper context and make a real impact you'll need to provide some descriptive information that doesn't have a natural chart form. So it makes sense to take some time to think about prose whether you listen to my earlier advice or not.

I'm not saying we can't enhance charts by adding more visual cues that help with context, if we have relevant information available. The chart below is the same as above except with a reference line for the median salary for the made-up company I've decided they work for. Now we can see that Bob's salary is much closer to the median than Aaron's (as you might expect).

Let's try to put the salient details from the chart above in a sentence or two: "Bob's salary of $30,000 is 80% of the company median of $37,500; he would have to work for 150 years to earn the $4.5 million that Aaron earns in just one twelve-month period." From this we learn precisely what Bob's salary is, how Bob's salary compares to the median, precisely what the median is, how Bob's salary compares to Aaron's salary and what Aaron's salary is. The only information we're not given directly is how Aaron's salary compares to the median. But since we know Bob's salary is similar to the median but two orders of magnitude less than the Aaron's, it should be fairly evident that Aaron's salary is two orders of magnitude greater than the median.

Using prose to communicate data effectively isn't just about picking the right number formatting and sentence structure. You also need to use the right units for your audience: I could tell you that the Andromeda galaxy is about 780 kiloparsecs away, but unless you've taken an astronomy course you're unlikely to feel better informed. If I told you it was two and a half million light years from Earth you might at least be inclined to think "oh, that's a really long way". More people will understand that light travels a long way in a year than will know that a parsec is the distance at which the mean radius of the Earth's orbit subtends an angle of one arcsecond and that a kiloparsec is a thousand times that distance. Don't be afraid to use unusual units of measurement, perhaps alongside conventional ones, to provide context when you expect your audience will lack domain expertise.

Take the time to think about how best to express your key values, which set of units to express them in and how to make comparisons easier. Turn to charts when you have something important to convey that can't be said in a few words and when you want to highlight patterns, trends and differences rather than provide precise values (where a table should be used instead). Whichever option you go for, remember to provide context.

Try one of our most wanted features - the new XAML 3D Surface Chart and deliver fast, visually appealing and customizable 3D surface visualizations! Download Infragistics WPF 16.1 toolset from here.

Why you need a Silverlight Migration Strategy

$
0
0

It’s been nearly ten years since the dawn of Silverlight’s release. In late 2015 the Microsoft team announced for it’s latest version, Silverlight 5, a road-map which includes a projected time-frame to maintain support - effective through 2021.

Silverlight’s official road-map

Microsoft Edge, Google Chrome, and Safari no longer support Silverlight, Mozilla Firefox will discontinue support for Silverlight within the next year.

Compatible Operating Systems and Browsers

Things to take into consideration when planning a Silverlight migration strategy:

Here are some questions you may be asking yourself:

1. Am I ready for HTML 5, or other technologies?
2. I’m ready but where do I begin?
3. How long can I maintain our Silverlight apps?
4. Which applications are capable of migrating? Which applications are not feasible?
5. Is there a demand for it? (e.g. End-users seeking new features)
6. Would I be willing to support older browsers? (eg. justify supporting a plug-in due to its maturity)

It is vital to have access to the latest tools, the right tools, to get the job done and exceed expectations for your next application. 

Establishing a migration strategy will lay the ground work and stand as a blueprint for new and existing projects. You should begin planning what platform you will migrate to as soon as possible as that decision will save you time, energy and resources.

You need a plan that's easy for you and your team to follow. Whether you decide to move to HTML 5 with Angular or another platform, having a strategy will ensure a seamless migration so that their business and personal core values are met with minimal amount of downtime.

Technological advancements help evolve the methods of building great software and change is inevitable. But change can happen gradually. It's important to have sound strategy; so that it will help you make the right choices and build new and exciting experiences.

Download and try Ignite UI: jQuery/HTML 5

IGNITE UI 2016 VOL. 1 PLATFORM INSTALLER

Getting started with the Ignite UI igTree in three simple steps

$
0
0

Trees are some of the most important controls used to build modern web applications. HTML does not provide any tree elements out of the box, but by using the Ignite UI library by Infragistics, you can very easily create a tree control in your application – simply use the Ignite UI tree control, igTree. In this post, we will show you how to get started with this control in three simple steps. Let’s get started!

Step1: Adding References

To work with any IgniteUI control, first we need to add the required JavaScript and CSS references. So, let us start with that. We have two options to add references:

  1. Download IgniteUI and add the required files to your project, referencing local IgniteUI files from the project.
  2. Via CDN: the Ignite UI team provides a public CDN to use.

In this example I am going to use the Ignite UI CDN. So we can add references as shown in the listing below:

< head>< title>igTree demo< linkhref="http://cdn-na.infragistics.com/igniteui/2016.1/latest/css/themes/infragistics/infragistics.theme.css"rel="stylesheet"/><linkhref="http://cdn-na.infragistics.com/igniteui/2016.1/latest/css/structure/infragistics.css"rel="stylesheet"/><scriptsrc="http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.8.3.js"><scriptsrc="http://code.jquery.com/jquery-1.9.1.min.js"><scriptsrc="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"><scriptsrc="http://cdn-na.infragistics.com/igniteui/2016.1/latest/js/infragistics.core.js"><scriptsrc="http://cdn-na.infragistics.com/igniteui/2016.1/latest/js/infragistics.dv.js"><scriptsrc="http://cdn-na.infragistics.com/igniteui/2016.1/latest/js/infragistics.lob.js"><scriptsrc="demo.js">

Essentially we are adding references of

  • Ignite UI CSS libraries
  • jQuery library
  • jQuery UI library
  • Ignite UI core, dev, and lob libraries.

Keep in mind that you need to follow the same sequence of adding references as shown in the above listing. You may notice that I have also added a reference to the demo.js file. As a starter, demo.js contains a function as shown in the listing below. We will write all the required JavaScript codes inside this function.

$(function () {


    
});

Step 2: Creating Data

We can bind data from different sources, in either of the following forms:

  • XML data
  • JSON data

Let us start with creating LOCAL JSON data to bind to igTree. In this example we are creating foodsData, which has three fields: ID, Type, and Items.

var foodsData = [
        {'ID':1,'Type':'Drinks','Items': [
            {'name':'Pepsi'
            },
            {'name':'Sprite'
            },
            {'name':'Sprite'
            },]
        },
         {'ID':2,'Type':'Food','Items': [
                 {'name':'Burger'
                 },
                 {'name':'Bread'
                 },
                 {'name':'Taco'
                 }, ]
         },
         {'ID':3,'Type':'Salad','Items': []
         }

    ]

In a real application, most of the time, data will be fetched from the server. So the server will have a REST API, and before binding JSON data from the REST API, we will have to create the Ignite UI data source, which can also be created for the local data too.  We can create an Ignite UI data source for the foodsData JSON array as shown in the listing below:

var ds =new $.ig.DataSource({
        type:"json",
        dataSource: foodsData
    });
    ds.dataBind();

Step 3: Creating Tree

So far, we have added the references and created the data to be bound. Now a igTree can be created in two steps:

  1. Create a ul element
  2. Convert the ul element to igTree and set the data source

We have the ul element in HTML as shown in the listing below:

<ulid="countryTree"></u l>

In the second step, we need to convert the HTML ul element to the igTree and set its data source and binding. We can set data source directly to JSON data or igDataSource. We have already created a data source in the previous step, so let us use that as the dataSource of igTree, and create the igTree as shown in the listing below:

$("#countryTree").igTree({
        dataSource: ds,
        bindings: {
            textKey:"Type",
            valueKey:"ID",
            childDataProperty:"Items",
            bindings: {
                textKey:"name",
            }
        }
    });

If you take a closer look, you’ll see that we’ve set the binding properties to the different fields of the JSON data. For example, textKey is set to Type field, valyeKey to the ID, and so on. At this point, when running the application, you will find the igTree generated with the local JSON data.

Here the Salad node is empty because there are no items in it. For the other nodes, sub items are bound using the Items field of the data source.

So there we have it: we’ve created a tree! Now you may want to click on one of the nodes to select them. To do that, there are many events exposed on igTree.  However, to select a particular item, you need to handle nodeClick event of the igTree. A particular node item’s name can be selected using the ui.node.data.name

nodeClick:function (evt,ui) {
            console.log(ui.owner);
            console.log(ui.node);
            console.log(ui.node.data.name);
        }

Putting it all together

To see the full picture, let us put every piece of code together. To create the igTree, the HTML will contain references and just one ul element. In the JavaScript, we are creating the data source and then using the selector creating igTree. The complete JavaScript file will look like this:

$(function () {var foodsData = [
        {'ID':1,'Type':'Drink','Items': [
            {'name':'Pepsi'
            },
            {'name':'Sprite'
            },
            {'name':'Sprite'
            },]
        },
         {'ID':2,'Type':'Food','Items': [
                 {'name':'Burger'
                 },
                 {'name':'Bread'
                 },
                 {'name':'Taco'
                 }, ]
         },
         {'ID':3,'Type':'Salad','Items': []
         }

    ]

    var ds =new $.ig.DataSource({
        type:"json",
        dataSource: foodsData
    });
    ds.dataBind();

    $("#countryTree").igTree({
        dataSource: ds,
        bindings: {
            textKey:"Type",
            valueKey:"ID",
            childDataProperty:"Items",
            bindings: {
                textKey:"name",
            }
        },
        nodeClick:function (evt,ui) {
            console.log(ui.owner);
            console.log(ui.node);
            console.log(ui.node.data.name);
        }
    });
});

Conclusion

There you have it: the beginnings of working with the igTree! Keep an eye out for future posts where we’ll focus on other features. Thanks for reading!

Ready for Launch?

$
0
0

SpaceX

Space exploration is humanity's ultimate design challenge. To start, some fundamental laws of physics must be overcome in order to escape Earth's gravitational pull. Then, a life sustaining environment must be created in the inhospitable vacuum of space. This seemingly impossible goal was achieved during the space race of the 50's and 60's, but rockets designed for sustainable space exploration have only recently seen significant improvement.

Last month, SpaceX successfully launched their Falcon 9 rocket, transporting a commercial, communications satellite into low-earth orbit, and landed the rocket safely on a drone ship. This is one of many missions that will incorporate reusable, self-landing rockets. While the engineers at SpaceX made this miracle of physics look easy, it was a long road of trial, and especially error (two and a half years and three consecutive failed launches), that ultimately lead to the company's success.

SpaceX founder Elon Musk has compared the challenge of building a rocket to his experience in software engineering:

"The best analogy for rocket engineering is if you wanted to create a really complicated bit of software. You can't run the software as an integrated whole, you can't run it on the computer it's intended to run on, but the first time you put it all together and run it on that computer it must run with no bugs."

This leads to an interesting comparison to the UX Design work that I do. While designing a software application may not be as daunting a task as building a rocket (or even coding a software application), there are still challenges that cause projects to fall short of perfection. 

Functionality-Centered Design Challenge

Many of us are familiar with typical business software that attempts to improve efficiency, but ultimately produces a tangled knot of functionality. This reoccurring pattern stems from the impulse to simply gather all the necessary functionality in one place, hoping a positive user experience will emerge once it is rolled out. The resulting user experience is one that is function-centric rather than user-centric, and typically results in an unintuitive “toolbox”. As a result, companies end up wasting time and money on training as users are forced to adapt to a poorly designed application.

People are expected to adapt because they have no other choice. On the other hand, rockets don’t adapt to poor design – they explode. Rockets are treated with respect. People are treated with contempt – if they are considered at all.

Design Solution

The design process we follow identifies the needs of the user population and uses this information to guide the decisions necessary to craft useful and usable applications. When a design challenge is approached from a focus on these fundamentals, an organic solution emerges that coordinates functional requirements with user needs. The result is an application that is pre-adapted to meet the needs of those that will use it.

The success of business software product launches is determined by metrics like user adoption and productivity. When a launch fails, companies typically rely on training and managerial mandates to bridge the gap between user needs and software design. When designing for a launch that ultimately has to overcome the force of gravity, no gaps can be left. Hard science reveals a rigid set of nonnegotiable requirements that must be met 100% of the time in order for the product to be considered “successful”.

This is a lesson the software industry needs to take to heart. As a species, we are all designing a small piece of the future, and like the space industry, we should strive for perfection. While it’s true that we are not usually tackling projects of interstellar magnitude or dealing with requirements fixed like laws of nature, we cannot rely on users to make up for shortcomings in our designs. Sure, we can take comfort in the fact that our projects are unlikely to literally crash and burn on live television, but that’s a small comfort when millions are spent on software that no one wants to use.


About the SwfConfig File

$
0
0

What is the SwfConfig file?

The SwfConfig file, or .NET Add-in Extensibility configuration file as it is sometimes referred to by HP, is a XML formatted configuration file. This file is always located at the location:

{$HPTestingSoftwareInstallDirectory}\dat\SwfConfig.xml

This configuration file is read by HP’s UI testing software whenever you create a new or open a different existing test. This file is used to map the UI controls that you interact with for recording and replaying automated tests to a custom server proxy, such as what Infragistics IG TestAutomation, formally TestAdvantage, does for Infragistics Windows Forms UI controls.

What Information does the SwfConfig file Contain?

HP UI testing software loads this XML file into an internal table every time you either you create a new script or open an existing one. This timing should be noted, on one hand it offers the user the ability to change the SwfConfig file without closing the testing software, but on the other changes to the file do not take effect if you don’t change the active script. Also the configuration is not tied to a script, an existing script can be working fine, but changes to the SwfConfig file can break the script, even though the script itself wasn’t changed.

The above mentioned table maps the text Type name of a .NET UI Control that inherits from System.Windows.Forms.Control to the DLL’s and classes that are intended to control the record functionality, the replay functionality, and an interface that tells the testing software what methods are intended to be public. In addition Settings specific to the proxy can me stored as parameters, those about are exposed via the Settings Utility entry that correspond to the control as well as in a script.

How does the SwfConfig file work?

During Record

HP listens to low level windows messages to determine which control you are attempting to interact with. In the case of keyboard interaction, it bases off what Control has keyboard focus, in the case of Mouse interactions it bases it off of if you Clicked or moved inside the bounds of that control. When testing software identifies a control it first checks the Object Repository to see if it has already interacted with the control. It then looks up the Type name of the control in the SwfConfig based table. If the software finds the Type name in the table, and if the DLL referenced in the CustomRecord tag is not already loaded, the software will then attempt to load the DLL.

NOTE: While the UI Testing software can responds to mouse hovers, mouse moves and similar indirect actions. Those indirect action will not cause it to trigger an initial load of a custom server proxy, only a Click, gain focus, or keyboard input will trigger the initial load.

During Replay

Each line of script references one or more objects in the Object Repository. Internal to the Object Repository it stores the type name, and when you run the line of script, it will look up the type name in the SwfConfig based table. If the software finds the Type name in the table, and if the DLL referenced in the CustomReplay tag is not already loaded, the software will then attempt to load the DLL.

Troubleshooting

As the primary use of the SwfConfig file is to match the UI control under test with the custom proxy server DLL associated with it, and since that DLL contain all the record and replay functionality for that control, any issue with the SwfConfig will in turn break all of the custom record and replay functionality for that control.  

The symptoms of issues with the SwfConfig.xml vary depending on the root cause, and the timing of when you are getting those symptoms either via record or replay. The resolutions will vary depending on the symptoms.

During Record

In many cases, you can identify an issue with the SwfConfig file, when recording against an Infragistics control, in the recorded script line the objects are proceeded with Swf, such as SwfObject or SwfTable, but the action recorded is Click #,# representing X and Y coordinates or Type “string value”.

It should be noted that it is possible that the HP UI testing software may record actions other than Click X, Y or Type “string” and still be a problem with the SwfConfig file. This is because they have implemented some functionality for Infragistics controls. The functionality that was implemented was done based on a limited subset of our controls at the time of their implementation. The controls and feature sets that have support are roughly based on the controls we had a the time of their implementation of the support, which is approximately the NetAdvantage 2005 volume 1 version of the controls.

When IG TestAutomation was first created its initial implementation was based on the support already provided, so the actions that might be recorded would be similar to actions recorded by TestAdvantage, but likely the actions recorded will be limited and not replay as intended as the NetAdvantage controls have changed over the years.

By the nature of how the HP UI testing software handles recording, you will very rarely get a discernable error, as they regularly swallow all errors.

 

During Replay

Typically the only way you will tell you have an issue from Replay is from a previously successfully recorded script. As an improperly configured SwfConfig file means you wouldn’t be able to record either, means you are likely testing an existing script, such as those that come with the samples.

Some of the most common issues that you will get during replay are via one of the following exceptions.

This happens when the version of TestAdvantage doesn’t match the version of NetAdvantage that you are using for the UI control in the application under test (AUT). The nature of the exception is TestAdvantage has references to NetAdvantage assemblies, but of a difference version than is included in the AUT. It attempts to find it, which in normal circumstances it would load it from the AUT, but as they are different it is unable to find the assembly it needs.

 

2.       Throws a ‘Cannot cast exception’ exception, and the same named assembly but from two different versions.

Similarly this also happens when the version of TestAdvantage doesn’t match the version of NetAdvantage that you are using for the UI control in the application under test (AUT), the difference being it finds the DLL’s that it is looking for, likely in the Global Assembly Cache (GAC), but when it attempts to convert the UI Control from the AUT, to the UI Control it has a reference to, it throws the exception because they are different.

 

3.       Throws an ‘Object doesn’t support this property or method’ or ‘Object doesn’t support this action’ exception. But the method or property exists in the intellisense for the object.

Object does not support this property or method

Object doesn't support this action

These exceptions are caused by not having any version of TestAdvantage defined in the SwfConfig. Typically caused by either an empty, SwfConfig and/or by setting the VersionUtility to disabled. But can also be caused by the DLL’s pointing to an invalid file location.

Your guide to following the action at Apple WWDC 2016

$
0
0

Apple’s Worldwide Developers Conference (WWDC) is set to kick off on June 13 at the Bill Graham Civic Auditorium and run until the 17th. If you weren’t able to make it out to San Francisco for this year’s WWDC conference, don’t worry— we’ve got you covered!

Apple themselves have made the conference more accessible than ever via live streaming of daily sessions on their website as well as the WWDC app for iOS and tvOS, available for download from the App Store. You can also stay tuned with Twit for coverage via live-streaming and blogging throughout the weeklong conference.

If video doesn’t work for you, Reddit and Twitter are the places to be to keep up with the action. Reddit will be maintaining a live mega-thread throughout the week, and you can follow the below Twitter hashtags to see what others are saying about the conference:

Plenty of news outlets will also be providing up to the minute resources throughout WWDC, including The Telegraph,  The Verge, and CNET. With all these resources available, you’ll be just as up to date as the attendees at Moscone West!

Staying on top of the latest Apple news in order to create high performance, totally native iPad and iPhone applications? Don’t forget to download a free trial of Infragistics’ iOS controls!

The Usability of Self-Service Beer

$
0
0

I recently experienced a major failure in an interesting attempt at self-service automation – self-serve beer taps at a Milwaukee Brewers game. If self-serve beer would work anywhere, you’d think it would work in the beer capital of America - Milwaukee, Wisconsin.

Self service beer machine

If the system worked, self-serve beer taps would require fewer beer vendors, saving the concession company money. It could reduce time waiting in line, increasing convenience for the customers. And I admit it was a fun novelty to try out the new system and pour my own beer.

For a self-service system to work well, it has to be so extremely simple and usable, that customers can literally “walk-up and use” the system without instruction. However, self-serve beer taps are unique, in that they have to be far easier to use than other self-service systems, like ATMs or grocery checkout systems, because customers become increasingly impaired by the product.

So let’s look at how the system works from an ideal perspective.

  1. You wait in line for a cashier.
  2. You purchase a $15 or $25 card, like a gift card, from the cashier. At $7.50 per beer, you can skip the cashier line the second time, with a $15 card.
  3. You take a plastic cup.
  4. You go up to one of the beer taps and tap your card.
  5. On a screen, you select the type of beer you want.
  6. A timer begins counting down on the screen, showing you how much time you have left to fill your cup.
  7. You pull the tap and pour the beer into your cup.

Problems with Self-Service Beer

That sounds pretty simple, but let’s look at the problems with the experience.

You have to wait in line for a cashier

I’m not a big fan of replacing people with machines, but isn’t the main benefit of a self-service system to save money on employees? And aren’t customers supposed to benefit by spending less time in line? Yet, even with several beer tap systems sitting unused, customers have to wait in a single line to purchase cards from the cashier. The line wasn’t that long at a late season Brewers game, but I imagine that the line would be much longer for a more popular game. I found out later that the cashier had an even more important job than to sell cards.

You need to buy a card

When I got to the cashier, I used my credit card to buy a beer card, which I then tapped on the beer machine. Why the extra step of purchasing a beer card? Wouldn’t it save a few steps if I could swipe my card at the beer machine itself? It could even accept cash purchases, as subway ticket machines commonly do. I’ve seen Coke machines recently that accept cash and credit cards, but I suppose the limitation with beer is that it has to be monitored to prevent underage buyers – another reason why beer can never be completely self-service.

The timer is scary

Immediately after selecting the type of beer you want, a big timer appears onscreen with a scary countdown. Your immediate thought is, “Oh crap, I’ve got to hurry before time runs out!” Unless you’re a professional bartender, most people don’t know how long it takes to dispense a beer. The countdown timer scares you into hurriedly pouring your beer, which leads to the next problem.

It’s difficult to correctly pour a beer

When amateurs hurriedly pour a beer from a tap, the cup fills up with foam instead of beer. I used the system three or four times, and this happened to me every time, and it happened to nearly everyone else I saw pouring their own beer. The key is to take your time and pour it very slowly, yet the prominent countdown scares you into the exact opposite action – pour as quickly as possible before the time runs out.

Customers need assistance

Each time I filled my cup with foam, the cashier patiently came over, swiped her master beer card, and poured the beer for me correctly – slowly filling it with a very tilted cup. She did this automatically for nearly every customer, as if it was just an expected part of the process. The customer would screw up pouring his or her beer, and she would come over and do it correctly for them.

Who Does this Benefit?

While the UX designer in me was fascinated at trying out this new system and noting its flaws, the beer drinker in me simply wanted another beer, but this system was too difficult. Self-service systems only work when they benefit both the company and the customer. With the need to employ a cashier to sell cards, check ID’s, and pour beer for most customers, and the fact that a lot of beer is wasted when customers fill up their cups with foam, I can’t see how it benefits the company. With the need to wait in line to buy a card, and with the inability to pour their own beer, it doesn’t benefit customers either.

I think the lesson is that some things aren’t meant to be automated. If I have to pay an outrageous price for stadium beer, I’d rather have an expert pour it for me. If you’re going to make customers do the work with a self-service system, make sure you design and usability test the system to ensure that it’s extremely easy to walk up and use.

Killer UI & Death Ray in Las Vegas

$
0
0

Parallels between familiar architectural conventions and the practice of user experience.

The Deadly Serious Series.

A few weeks ago I was offering an “expert” opinion as a classically trained architect and a User Experience newbie. I stated that in the field of UX one is less likely to affect people’s health and well-being compared to architecture. UX tends to focus on digital rather than physical experiences 

BIG difference in scale. Try comparing an interface to a urban landscape.

and, in principle, UX allows for more research and testing before a product is actually released. Thorough research and testing on a per-project basis isn’t a well established practice in architecture, despite a long history of guidelines, tradition and occasional innovation. Adding more research to the process of putting roofs over our heads, as important as it is, increases time and cost exponentially. As a result, almost everyone pretends that particular elephant is not in the room. 

Like this guy here, Rafael Vinoly. He has an unlucky hot spot for architecture.

Vinoly was the architect of a hotel in Las Vegas, nicknamed “Death Ray”, whose reflective facade melts plastic cups, causes severe sunburns and singes the hair of people having a relaxing day at the pool via a constantly moving, 15sq feet area of highly-focused sunlight. It’s a spa hotel?—?awesome right? :D

 

I’ll just leave these two here.

 

A few years later, Vinoly designed a skyscraper in London’s financial district, nicknamed “Walkie?—?Talkie Death Ray” (not that cool the second time, I know). This building’s facade melts cars and allows adventurous people to fry eggs on the spot…just because they can!

 

Jaguar on the melt & Sustainable architecture on high cholesterol diet.

 

There are more examples, but you get the idea. Unlike apps, you cannot withdraw those from GooglePlay or iTunes. And having your phone crashing once in a while is hardly comparable to a melted Jaguar or sc?rched hair after a day at the pool. Sure, you can apply some beta enhancements but the damage is done.

As it usually happens, my foolishness got what it deserved. Just 3 days later I was proven wrong as I stumbled upon an article describing an unfortunate incident in which a piece of medical software was a direct contributor to the death of a young cancer patient. In this case, three medical specialists, with over 10 years of experience each, did not notice the red alert text in the top right corner of the screen displaying the patient’s information. They were so distracted by the poorly designed software that each of them, independently, missed it.

It’s not a happy ending story. It’s not a fun one. It’s definitely not one those socially acceptable conversational topics for your next party. It makes you feel kind of uncomfortable and brings home the fact that what we do as UX professionals can have an enormous impact.

If this cloud can be said to have a silver lining, it would be

Looking like that. Some fat SILVER lining we've got here.

 

that, while we have a lot to learn, we are on the right path toward discovering and establishing guidelines that support the conscientious and careful building of “safe” user experiences.

After all, digital products engage as much of our time as the architecture with which we are physically surrounded.

 

Dips on the swing! Now go out there and be a good Care Bear:)

UX Scotland 2016 Conference Recap

$
0
0

On the 7th - 9th of June, I was lucky enough to have been invited to speak at UX Scotland in Endinburgh. UX Scotland is the annual hands-on, practical UX and design conference for the UX, Service Design and Digital Communities in Scotland and the north of England. Held at Our Dynamic Earth, more than 200 attendees were given the opportunity to learn from peers and industry leaders, improve their skills and make professional connections.

ourdynamicearth

Our Dynamic Earth /\

Into the mix of workshops and presentations, I spoke about Architecting Speed | Making Racing Data Useful. Centered around work that I’ve done creating a meaningful representation of the large amounts of data collected during motorcycle racing, my presentation was aimed at teaching attendees the difference between data and information.

Architecting Speed | Making Racing Data Useful

Proof I was there ;-) /\

Data vs Information

What typically happens when clients want to make use of large sets of data? They request a dashboard or a data visualization. While those tools definitely make the data more colorful, they don’t necessarily make the data more meaningful. And meaningfulness is key. People don’t act on data. People act on information. Unless the data has been shaped to provide immediate information based on what users are trying to achieve, the burden of converting that data into information is left to the user. When that happens, we’re not doing our jobs.

IMG_3369

Better proof I was there ;-) /\

---------------------------------------------------------

Kevin Richardson has been working in the area of user experience for 25 years. With a PhD in Cognitive Psychology, he has experience across business verticals in the fields of research, evaluation, design and management of innovative, user-centered solutions.

Kevin’s experience includes web sites, portals and dashboards, enterprise software and custom business applications for medical, pharmaceutical, communications, entertainment, energy, transportation and government users.

On the weekends, you can find Kevin on his motorcycle, racing for Infragistics Racing at a number of different racetracks on the East coast

Infragistics Windows Forms Release Notes – June 2016: 15.2, 16.1 Service Release

$
0
0

With every release comes a set of release notes that reflects the state of resolved bugs and new additions from the previous release. You’ll find these notes useful to help determine the resolution of existing issues from a past release and as a means of determining where to test your applications when upgrading from one version to the next.

Release notes are available in both PDF and Excel formats. The PDF summarizes the changes to this release along with a listing of each item. The Excel sheet includes each change item and makes it easy for you to sort, filter and otherwise manipulate the data to your liking.


Windows Forms 2015 Volume 2 Service Release (Build 15.2.20152.2281)

Windows Forms 2016 Volume 1 Service Release (Build 16.1.20161.2033)

 

How to get the latest service release?

Infragistics Android Release Notes – June: 15.2, 16.1 Service Releases

$
0
0

Release notes reflect the state of resolved bugs and new additions from the previous release. You will find these notes useful to help determine the resolution of existing issues from a past release and as a means of determining where to test your applications when upgrading from one version to the next.

Release notes are available in both PDF and Excel formats. The PDF summarizes the changes to this release along with a listing of each item. The Excel sheet includes each change item and makes it easy for you to sort, filter and otherwise manipulate the data to your liking.

In order to download release notes, use the following links:

Android 2015 Volume 2 Service Release

PDF - Infragistics Android 2015 Volume 2 (Build 15.2.20152.2064)
Excel - Infragistics Android 2015 Volume 2 (Build 15.2.20152.2064)

Android 2016 Volume 1 Service Release

PDF - Infragistics Android 2016 Volume 1 (Build 16.1.20161.2025)
Excel - Infragistics Android 2016 Volume 1 (Build 16.1.20161.2025)


Infragistics Xamarin Forms Release Notes – June: 15.2, 16.1 Service Releases

$
0
0

Release notes reflect the state of resolved bugs and new additions from the previous release. You will find these notes useful to help determine the resolution of existing issues from a past release and as a means of determining where to test your applications when upgrading from one version to the next.

Release notes are available in both PDF and Excel formats. The PDF summarizes the changes to this release along with a listing of each item. The Excel sheet includes each change item and makes it easy for you to sort, filter and otherwise manipulate the data to your liking.

In order to download release notes, use the following links:

Xamarin Forms 2015 Volume 2 Service Release

PDF - Infragistics Xamarin Forms 2015 Volume 2 (Build 20152.2170)
Excel - Infragistics Xamarin Forms 2015 Volume 2 (Build 20152.2170)

Xamarin Forms 2016 Volume 1 Service Release

PDF - Infragistics Xamarin Forms 2016 Volume 1 (Build 16.1.20161.2032)
Excel - Infragistics Xamarin Forms 2016 Volume 1 (Build 16.1.20161.2032)

Infragistics Silverlight Release Notes – June 2016: 15.2, 16.1 Service Release

$
0
0

Release notes reflect the state of resolved bugs and new additions from the previous release. You will find these notes useful to help determine the resolution of existing issues from a past release and as a means of determining where to test your applications when upgrading from one version to the next.

Release notes are available in PDF, Excel and Word formats. The PDF summarizes the changes to this release along with a listing of each item. The Excel sheet includes each change item and makes it easy for you to sort, filter and otherwise manipulate the data to your liking.

In order to download release notes, use the following links:

Silverlight 2016 Volume 1 Service Release (Build 16.1.20161.2050)

Silverlight 2015 Volume 2 Service Release (Build 15.2.20152.2141)

Infragistics WPF Release Notes – June 2016: 15.2, 16.1 Service Release

$
0
0

Release notes reflect the state of resolved bugs and new additions from the previous release. You will find these notes useful to help determine the resolution of existing issues from a past release and as a means of determining where to test your applications when upgrading from one version to the next.

Release notes are available in PDF, Excel and Word formats. The PDF summarizes the changes to this release along with a listing of each item. The Excel sheet includes each change item and makes it easy for you to sort, filter and otherwise manipulate the data to your liking.

In order to download release notes, use the following links:

WPF 2016 Volume 1 Service Release (Build 16.1.20161.2056)

WPF 2015 Volume 2 Service Release (Build 15.2.20152.2160)

The Human Cost of Tech Debt

$
0
0

If you're not already familiar with the concept of technical debt, it's worth becoming familiar with it.  I say this not only because it is a common industry term, but because it is an important concept.

Coined by Ward Cunningham, the term introduces the idea that taking shortcuts in your software today not only means paying the price eventually -- it means paying that price with interest.  In other words, introducing that global variable today and saving half a day's work ahead of shipping means that you're going to pay for it with more than half a day's labor down the line.

The Power of the Metaphor

I've spent significant time doing IT management consulting in recent years, after spending years and years writing code.  And I can tell you that this metaphor for shortcuts in the codebase is a powerful one when it comes to communication between the business and the software development group.  When you explain software decisions to managers and MBAs using the language of economics, they get it.

Because of the metaphor's power and subsequent effectiveness for business concerns, it is often used to describe the health of projects, particularly vis a vis deadlines and milestones.  The developers may communicate that an aggressive deadline will result in technical debt, making features in the future take longer to ship.  Analysts and project managers might account for technical debt when discussing slipped deadlines.  IT upper management might ask for an assessment of the amount of technical in an application when making a strategic, replace/retire/rewrite decision.

The problem of technical debt is for most people, in essence, a problem of time to market.

But I'd like to talk today about the human side of the problem.  And, make no mistake -- in business, all human problems are also business problems, viewed with a wide enough lens.  Unhappy humans are unhappy workers, and unhappy workers are less productive.  Yet, this angle of technical debt is seldom discussed, in my experience.

Unpleasant Work

For a manager, a code base high in technical debt means that feature delivery slows to a crawl, which creates a lot of frustration and awkward moments in conversation about business capability.  For a developer, this frustration is even more acute.   Nobody likes working with a significant handicap and being unproductive day after day, and that is exactly what this sort of codebase means for developers.

Each day they go to the office knowing that it's going to take the better part of a day to do something simple like add a checkbox to a form.  They know that they're going to have to manufacture endless explanations for why seemingly simple things take them a long time.  When new developers are hired or consultants brought in, they know that they're going to have to face confused looks, followed by those newbies trying to hide mild contempt.

To tie this back to the tech debt metaphor, think of someone with mountains of debt trying to explain being harassed by creditors.  It's embarrassing, which is, in turn, demoralizing.

Team Infighting

Not surprisingly, this kind of situation tends to lead to bickering among the team.  Again, the metaphor holds as one would expect this kind of behavior from a married couple with crippling debt.  Teams draw battle lines.

It might be the aforementioned newbies against the tenured staff upon whom they blame the problem.  It might be the maintenance programmers versus the developers or the people on the green field project versus the people responsible for the legacy beast in which the tech debt resides.

Whatever those lines may be, they become real and they become problematic.  They add acrimony on top of the frustration and embarrassment of the problem itself.

Atrophied Skills

As embarrassment mounts and the blame game is played more vigorously, team members can feel their professional relevance slipping away.  After all, tech debt creates substantial drag not only on feature development, but on the general evolution of a codebase.

In these sorts of codebases, everything becomes difficult.  Teams postpone upgrading to the latest version of the language.  They resist incorporating modern architectural and design practices.  They fear to replace outdated third party add-ins with modern ones.  Generally speaking, they want to touch things as little as humanly possible, because doing so further impairs their already lethargic process.  It's too slow and it's too risky.

But even as they make these decisions (or at least live with them when others make them), they understand that their market value is waning with each passing day.  It is not lost on them that while the wide development world embraces the newest JavaScript frameworks and domain driven design approaches, they're struggling to add features to a wheezy, CRUD-based, Winforms application.

The Hidden Business Cost: Turnover and Attrition

Hopefully it should be obvious to management that unhappy developers is a business problem and a serious one at that.  In the current IT market climate, developers have options -- even ones stuck on a legacy codebase with crippling tech debt.

Coming to work each day to work in a tortured code base, with disgruntled people, and with a mounting sense of irrelevance creates a team full of people that are going to be open to other options.  And, sooner or later, they're going to start leaving, and the ones leading the charge will be the ones the organization can least afford to lose.  It will become harder and harder to hire into the group and it will take longer and longer for those who do come in to be productive.

So when you think of tech debt, don't think only in terms of the business problem of delayed features and rising defect counts.  Think of the human cost, and the much more serious, much longer term business problem that results.

Want to build your desktop, mobile or web applications with high-performance controls? Download Ultimate Free trial today or contact us and see what we can do for you.

Infragistics ASP.NET Release Notes - June 2016: 15.2, 16.1 Service Release

$
0
0

With every release comes a set of release notes that reflects the state of resolved bugs and new additions from the previous release. You’ll find the notes useful to help determine the resolution of existing issues from a past release and as a means of determining where to test your applications when upgrading from one version to the next.

Release notes are available in both PDF and Excel formats. The PDF summarizes the changes to this release along with a listing of each item. The Excel sheet includes each change item and makes it easy for you to sort, filter and otherwise manipulate the data to your liking.

Download the Release Notes

ASP.NET 2015 Volume 2

ASP.NET 2016 Volume 1

Viewing all 2223 articles
Browse latest View live


Latest Images